我需要知道这两个陈述之间的技术差异以及它的行为:
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
答案 0 :(得分:8)
在方法调用之前总是会计算参数,而在方法调用期间,在方法控制的时间(如果它被评估过)中计算块。
在第一个示例中,参数"abc"
在调用方法new
之前计算一次。已评估的对象将传递给方法new
。在创建的数组的所有三个元素中使用完全相同的对象。修改一个意味着修改所有这些。
在第二个示例中,每次为数组生成新元素时,都会计算块{"abc"}
。创建的数组中的三个元素是不同的对象。