为什么@ Array.clear不起作用

时间:2016-05-24 14:15:58

标签: ruby

我在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

并且它不起作用;红宝石终端刚冻结。谁能告诉我我做错了什么?

谢谢!

2 个答案:

答案 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 ,您将最终得到一个无限循环...也可能是什么是“古怪”:)