我在ruby koans中做了about_dice_project.rb。我使用roll方法定义了DiceSet类,如下所示:
class DiceSet
attr_reader :values
def initialize
@values = []
@old_values = []
end
def roll(num_dice)
@old_values = @values
while @values == @old_values do
@values = []
(1..num_dice).each do
rnd = 1 + rand(6)
@values << rnd
end
end
end
end
我替换了
@values = []
与
@values.clear
并且它不起作用;红宝石终端刚冻结。谁能告诉我我做错了什么?
谢谢!
答案 0 :(得分:3)
运行@old_values = @values
时,两个变量都指向完全相同的对象。现在,当您将@values
新数组分配给@values = []
时,@values
现在是一个不同的数组对象。
但是,在运行@values.clear
时,您正在更改现有数组,即仍然指向相同的@old_values
。在这种情况下,向@values
添加新条目时,您也将它们添加到@old_values
(因为它们都指向同一个对象)。
您应该阅读有关Ruby如何处理变量和对象的更多信息。这是关于所有Ruby教程的第一课的一部分。
答案 1 :(得分:0)
之前是否定义了@values?如果在 @values = [] 行中引用它之前未定义它,则最终会出现错误:
NoMethodError: undefined method `clear' for nil:NilClass
我不熟悉about_dice_project.rb,但我不确定@old_values的目的是什么在这个函数中定义的。此外,如果您在开头定义 @values = [] 并执行 @old_values = @values ,您将最终得到一个无限循环...也可能是什么是“古怪”:)