在 Ruby 中,如何用可能的多个元素替换数组中的元素?
Posted
技术标签:
【中文标题】在 Ruby 中,如何用可能的多个元素替换数组中的元素?【英文标题】:In Ruby, how do I replace an element in an array with potentially multiple elements? 【发布时间】:2017-07-22 11:31:10 【问题描述】:使用 Ruby 2.4。我有一个字符串数组。如何用可能的多个元素替换数组中的一个元素?我有
phrases[index] = tokens
然而,tokens 是一个数组,现在这会产生一个带有字符串和数组的短语数组......
["abc", ["a", "b"], "123"]
如果标记是 ["a", "b"] 并且索引是 1,我希望结果是
["abc", "a", "b", "123"]
我该怎么做?
【问题讨论】:
【参考方案1】:您可以使用Array#[]=
指定start
和length
;从start
索引中替换length
元素的子数组
或指定range
;替换由索引范围指定的子数组。
phrases = ["abc", "token_placeholder", "123"]
tokens = ["a", "b"]
index = 1
phrases[index, 1] = tokens
# ^^^^^^^^^ ------------------ start and length
# OR phrases[index..index] = tokens
# ^^^^^^^^^^^^ -------------- range
phrases # => ["abc", "a", "b", "123"]
【讨论】:
很好,我从来没有遇到过这种语法。很高兴知道!ary[start, length] = obj or other_ary or nil
在 []=
文档中。【参考方案2】:
你可以使用Enumerable#flat_map:
arr = ["abc", ["a", "b"], "123"]
arr.flat_map(&:itself)
#=> ["abc", "a", "b", "123"]
arr
保持不变。原地修改arr
,
arr.replace(arr.flat_map(&:itself))
#=> ["abc", "a", "b", "123"]
arr
#=> ["abc", "a", "b", "123"]
【讨论】:
【参考方案3】:平面映射将是一种更好的方法,它映射(转换)然后将列表展平为单个数组。假设我们想为偶数添加两个元素:
(1..10).flat_map |i| i.even? ? [i, i**2] : i
它会返回:
[1, 2, 4, 3, 4, 16, 5, 6, 36, 7, 8, 64, 9, 10, 100]
与返回的地图相比:
[1, [2, 4], 3, [4, 16], 5, [6, 36], 7, [8, 64], 9, [10, 100]]
【讨论】:
以上是关于在 Ruby 中,如何用可能的多个元素替换数组中的元素?的主要内容,如果未能解决你的问题,请参考以下文章