a = [ 'a' ]
b = [ 'b' ]
def c
return [ 'c' ], [ 'd' ]
end
a, b += c # -> would be awesome, but gives syntax error
a, b = a + c.first, b + c.last # clunky and will call method twice...
# desired result
#
a == [ 'a', 'c' ]
b == [ 'b', 'd' ]
现在我经常发现自己在写:
t, tt = c
a += t
b += tt
但如果你问我,这有点丑陋。
编辑:单元素数组似乎让一些人感到困惑,因为下面的几个答案并不能回答这个问题。我通过让每个数组至少有 2 个元素来使其更加清晰。
Edit2:我向 ruby core 提交了一个功能请求,以在解构数组上实现复合赋值。
a,b = [a+b,c].transpose
#=> [["a", "c"], ["b", "d"]]
a #=> ["a", "c"]
b #=> ["b", "d"]
a, b = (a+b).zip(c)
# a => ["a", "c"]
# b => ["b", "d"]
希望对您有所帮助。
由于有
"没有临时副本"的要求,我会发布对任意数量的数组进行就地修改的解决方案
a1 = [ 'a1' ]
a2 = [ 'a2' ]
a3 = [ 'a3' ]
aa = [ a1, a2, a3 ]
cc = [ 'c1', 'c2', 'c3' ]
aa.each_with_object(cc.each) { |e, memo| e << memo.next }
#⇒ #<Enumerator: ["c1", "c2", "c3"]:each> # do not care, it’s memo
[a1, a2, a3]
#⇒ [ ["a1", "c1"], ["a2", "c2"], ["a3", "c3"] ]
无论cc
数组是否出于某种原因是一个数组数组,正如它在问题中指定的那样,它应该在某个步骤上展平,这取决于它应该如何添加到a
数组中。
到目前为止
,没有一个答案有效,所以现在我想出了nest_concat!(deep_concat似乎用词不当,因为我们只想要一个深度):
class Array
def nest_concat! other
each_with_index { |arr, i| self[i].concat other[ i ] }
end
def nest_concat other
d = map( &:dup )
each_with_index { |arr, i| d[i].concat other[ i ] }
d
end
end
允许您编写:
a = [ 'a', 'b' ]
b = [ 'c', 'd' ]
def c
return [ 'A', 'B' ], [ 'C', 'D' ]
end
[ a, b ].nest_concat! c
p a
p b
给
["a", "b", "A", "B"]
["c", "d", "C", "D"]