[["a", "a"], ["a", "a"]-6ren">
gpt4 book ai didi

ruby - 为什么 array.each 行为取决于 Array.new 语法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:02:44 24 4
gpt4 key购买 nike

我正在使用 Ruby 1.9.2-p290 并发现:

a = Array.new(2, []).each {|i| i.push("a")}    
=> [["a", "a"], ["a", "a"]]

这不是我所期望的。但以下构造函数样式确实符合我的预期:

b = Array.new(2) {Array.new}.each {|i| i.push("b")}
=> [["b"], ["b"]]

第一个例子是预期的行为吗?

在 ruby​​-doc 中,我的 size=2 参数对于两个构造函数来说似乎是同一种参数。我认为,如果 each 方法通过了该参数,那么它将以相同的方式为两个构造函数使用它。

最佳答案

这是一个常见的误解。在您的第一个示例中,您正在创建一个包含 2 个元素的数组。 这两个都是指向相同数组的指针。因此,当您遍历外部数组时,您将 2 个元素添加到内部数组,然后将其反射(reflect)在输出中两次

比较这些:

> array = Array.new(5, [])
=> [[], [], [], [], []]

# Note - 5 identical object IDs (memory locations)
> array.map { |o| o.object_id }
=> [70228709214620, 70228709214620, 70228709214620, 70228709214620, 70228709214620]

> array = Array.new(5) { [] }
=> [[], [], [], [], []]

# Note - 5 different object IDs (memory locations)
> array.map { |o| o.object_id }
=> [70228709185900, 70228709185880, 70228709185860, 70228709185840, 70228709185780]

关于ruby - 为什么 array.each 行为取决于 Array.new 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9036699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com