在下面的代码片段中,数组deck
应该等于[6,9,5,6,5,1,2]
,因为Ruby通过引用传递数组。方法调用后,卡组的值不会改变。这是为什么?为什么我不能修改方法中数组的值?
def count_cut!(deck)
s1, s2 = deck[0, deck.last], deck[deck.last..-2]
deck = s2 + s1 + [deck.last]
end
deck = [5, 1, 6, 9, 5, 6, 2]
count_cut!(deck)
p deck
我正在使用Ruby 1.9.2-p180。
那么为什么甲板是方法范围内的局部变量时,deck.replace会突变甲板?或者仅仅是一种特殊情况? – RaouL 2011-05-11 16:02:41
当你调用'deck = s2 + s1 + [deck.last]'你创建一个新的对象。你可以测试它,如果你把'deck.object_id'放在方法中后,并在'count_cut!(deck)后面' – 2011-05-11 16:14:27
如果你想这样想的话,赋值是一种特殊情况。所有的值都通过Ruby中的引用传递,所以任何修改实例的方法都会修改它。但分配会将该变量更改为指向新实例。 – 2011-05-11 17:19:13