【问题标题】:Why are there different results when assigning a value in a two-dimension array? [duplicate]为什么在二维数组中赋值时会出现不同的结果? [复制]
【发布时间】:2015-01-10 06:31:57
【问题描述】:

这两个作业有什么区别?为什么他们有不同的结果?

arr3 = Array.new(2, Array.new(2, 0))
arr4 = [[0, 0], [0, 0]]

arr3 == arr4  # => true
arr3 === arr4  # => true

arr3[0][0] = "/"
arr4[0][0] = "/"

arr3  # => [["/", 0], ["/", 0]]
arr4  # => [["/", 0], [0, 0]]

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    因为arr3 包含两个相同的对象,但arr4 包含两个不同的对象。

    >> arr3 = Array.new(2, Array.new(2, 0))
    => [[0, 0], [0, 0]]
    >> arr3.map { |ary| ary.object_id }
    => [73703490, 73703490]
    >> arr4 = [[0, 0], [0, 0]]
    => [[0, 0], [0, 0]]
    >> arr4.map { |ary| ary.object_id }
    => [73670930, 73670920]
    >>
    

    阅读new(size=0, default=nil)

    ...在第一种形式中,如果没有发送参数,则新数组将为空。当发送一个大小和一个可选的默认值时,会创建一个数组,其中包含默认值的大小副本。 注意所有元素都将引用同一个对象默认

    您使用上面的表单创建了arr3,同时使用文字构造函数[]创建了arr4

    using the literal constructor [] 可以创建一个新数组。数组可以包含不同类型的对象。

    如果您希望 Array::new 表现为文字结构,请使用 new(size) {|index| block } 形式。

    >> arr3 = Array.new(2){ Array.new(2, 0) }
    => [[0, 0], [0, 0]]
    >> arr3.map { |ary| ary.object_id }
    => [73551460, 73551450]
    >>
    

    【讨论】:

    • @sawa 我已经完成了.. 欢迎您更正.. :)
    【解决方案2】:

    arr3 中的两个元素共享同一个object_id,因此它们将一起更改。

    代码:

    arr3.each do |item|
      p item.object_id
    end
    
    arr4.each do |item|
      p item.object_id
    end
    

    但我仍然不知道为什么Array.new 会发生这种情况。

    【讨论】:

    • 我建议您对@Arup 的回答发表评论。
    • 我仍然不知道为什么Array.new 会发生这种情况。 -- 你看过我提到的 doco 链接了吗?跨度>
    • 这不是评论。我用@Arup 的回答同时回答了自己。我发了之后才看到这个。感谢您的回答和文档链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2018-08-02
    相关资源
    最近更新 更多