Ruby数组初始化

时间:2014-08-20 06:57:53

标签: ruby

我需要知道这两个陈述之间的技术差异以及它的行为:

arr = Array.new(3, "abc")
=> ["abc","abc","abc"]
arr.last.upcase!
=> "ABC"
arr
=>["ABC","ABC","ABC"]     # which is **not** what I excepted

另一方面:

arr = Array.new(3){"abc"}
=> ["abc","abc","abc"]
arr.last.upcase!
=>"ABC"
arr
=> ["abc","abc","ABC"]     # which is what I excepted

1 个答案:

答案 0 :(得分:8)

在方法调用之前总是会计算参数,而在方法调用期间,在方法控制的时间(如果它被评估过)中计算块。

在第一个示例中,参数"abc"在调用方法new之前计算一次。已评估的对象将传递给方法new。在创建的数组的所有三个元素中使用完全相同的对象。修改一个意味着修改所有这些。

在第二个示例中,每次为数组生成新元素时,都会计算块{"abc"}。创建的数组中的三个元素是不同的对象。