4
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​​ 核心提交了一个功能请求,以在解构数组上实现复合分配。

4

4 回答 4

5
a,b = [a+b,c].transpose
  #=> [["a", "c"], ["b", "d"]] 
a #=> ["a", "c"] 
b #=> ["b", "d"] 
于 2016-07-18T04:03:02.247 回答
5
a, b = (a+b).zip(c)
# a => ["a", "c"]
# b => ["b", "d"]

希望能帮助到你。

于 2016-07-18T05:09:36.567 回答
3

由于有“没有临时副本”的要求,因此我将发布对任意数量的数组进行就地修改的解决方案

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数组中。

于 2016-07-18T06:45:26.880 回答
0

到目前为止没有一个答案有效,所以现在我想出了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"]
于 2016-07-18T10:36:45.277 回答