【问题标题】:Push array into array on ruby by just one level将数组推入 ruby​​ 上的数组仅一级
【发布时间】:2015-08-28 12:08:05
【问题描述】:

给定:

a = [[1,"a"],[2,"b"]]
b = [[3,"c"],[4,"d"]]

我想把a 变成[[1,"a"],[2,"b"][3,"c"],[4,"d"]]。没有+ 怎么办?它创建了一个新数组,我想避免这种情况。

(a << b).flatten(1)
# => [1, "a", 2, "b", [3, "c"], [4, "d"]]

【问题讨论】:

  • 请注意,您预期的a 无效。

标签: arrays ruby immutability


【解决方案1】:
a.concat(b)

..................

【讨论】:

  • 但它创建了一个我想避免的新数组。
  • a.concat(b) 不创建新数组?
  • 我以为 concat 也会创建一个像 += 这样的新数组,不是吗?
  • a.concat(b) 会修改a 的内容,因此不会创建新数组。
  • 很容易确定:a = [1]; old_id = a.object_id; a.concat([2]); old_id == a.object_id 应该让您确信concat 没有创建新对象。
【解决方案2】:
> b.inject(a, :<<)
#=> [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]

【讨论】:

    【解决方案3】:
    a = [[1,"a"],[2,"b"]]
    b = [[3,"c"],[4,"d"]]
    a[a.length, 0] = b
    a
    # > [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]
    

    【讨论】:

    • 学到了一些新东西。
    【解决方案4】:

    concat 是答案,但你可以这样做:

    a.object_id    #=> 70223889895340
    a.replace(a+b) #=> [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]
    a              #=> [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]
    a.object_id    #=> 70223889895340 
    

    【讨论】:

      【解决方案5】:

      怎么样?

      a.push(b.shift) while b.any?
      

      【讨论】:

      • a.push(*b) 比你的差很多。
      • @sawa,哈哈。不知道那件事。谢谢。
      【解决方案6】:

      这个怎么样?

      a + b 
      => [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]
      

      【讨论】:

      • a+b 创建一个新对象,这是 OP 想要避免的(即 (a+b).object_I'd != a.object_id)。
      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多