我需要知道这两个语句之间的技术差异以及为什么它会这样:
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
参数总是在方法调用之前评估,而块仅在方法调用期间以方法控制的时间评估(如果曾经评估过)。
在你的第一个例子中,参数"abc"
在该方法之前评估一次new
叫做。评估的对象被传递给方法new
。创建的数组的所有三个元素中都使用完全相同的对象。修改一个就意味着修改所有。
在你的第二个例子中,块{"abc"}
每次为数组生成新元素时都会对其进行评估。创建的数组中的三个元素是不同的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)