新手问题 请教大家一个关于 Ruby 的 Array 的问题?

HyeKyoZ-github · September 26, 2017 · Last by HyeKyoZ-github replied at September 27, 2017 · 1323 hits
a = Array.new 3 do
      [0, 0, 0]
    end
a[0][1] = 2

# [[0, 2, 0], [0, 0, 0], [0, 0, 0]]
p a

###################

b = [0, 0, 0]
c = Array.new 3 do
      b
    end 
c[0][1] = 2

# [[0, 2, 0], [0, 2, 0], [0, 2, 0]]
p c

###################

d = Array.new(3, [0, 0, 0])
d[0][1] = 2

# [[0, 2, 0], [0, 2, 0], [0, 2, 0]]
p d

###################

根据以上结果产生的问题:三种初始化的结果为什么不同?a 与 d?,d 与 c?

测试环境:ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin17]

谢谢大家!


引用
引用

因为在 Ruby 中数组是可变对象,而且赋值 / 作为参数传递时,传递的都是引用。 关于 Ruby 的引用: https://en.wikibooks.org/wiki/Ruby_Programming/Introduction_to_objects

再就是 Array.new 方法的不同用法的语义,官方文档也是有介绍的: http://ruby-doc.org/core-2.4.1/Array.html#method-c-new

官方文档已经讲了很清楚了

new(size=0, default=nil) new(array) new(size) {|index| block }

In the first form, if no arguments are sent, the new array will be empty. When a size and an optional default are sent, an array is created with size copies of default. Take notice that all elements will reference the same object default.

HyeKyoZ-github closed this topic. 27 Sep 10:45
You need to Sign in before reply, if you don't have an account, please Sign up first.