是否有一个红宝石单行代码可以在没有临时副本的情况下连接嵌套数组


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"]

相关内容

  • 没有找到相关文章