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 

始终在方法调用之前评估参数,而仅在方法调用期间在由方法控制的时刻(如果它被评估)评估块。

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

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