1

我正在做 ruby​​ koans,我在 DiceSet 项目中。我已经创建了 DiceSet 类,但我的实例变量似乎并没有像我想象的那样与实例保持一致。我的代码是

class DiceSet
   attr_reader :values
   @values = []
   puts @values.class
   def roll(number_of_rolls)
     (1..number_of_rolls).each do |roll|
       puts @values.class
       @values << (1..6).to_a.sample
     end
     return @values
   end
end

公案然后使用我的 DiceSet 类

dice = DiceSet.new
dice.roll(5)
puts dice.values.class
assert dice.values.is?(Array)

我将 puts 命令放在那里以跟踪 @values 实例变量发生的事情,只有第一个 puts @values.class 说它是一个 Array 类。所有其他人都返回 NilClass。我是否错误地使用了实例变量,或者我还缺少什么?实例变量在方法调用后会被释放吗?

编辑:我的班级现在可以正常工作,因为我已将 @values = [] 放入 roll 方法中,如下所示。我现在唯一的问题是,为什么当我将 @values = [] 放在初始化方法中时,roll 方法认为 @values 是 NilClass 而不是数组

4

4 回答 4

1

在 Ruby 中,一切都是对象。Ruby 解释器假定所有实例变量都属于当前对象self。在类定义中也是如此。self的作用是属于类本身的,所以实例变量@values 是属于类的。不要混淆!类的实例变量不同于该类对象的实例变量。你也不需要明确指定return关键字试试这个:

class DiceSet
   attr_accessor :values       

   def roll(number_of_rolls)
     @values = []
     (1..number_of_rolls).each do |roll|
       @values << (1..6).to_a.sample
     end
     @values
   end
end

dice = DiceSet.new
dice.roll(5)
puts dice.values.class
assert dice.values.is_a?(Array)
于 2013-09-18T04:30:16.520 回答
0

每个DiceSet实例都有自己的@values,此外,类DiceSet也有自己的@values。它们都彼此不同。如果您希望实例和类共享同一个变量,则应使用类变量@@values

于 2013-09-18T04:17:01.057 回答
0

试试这个:

class Cat
  attr_accessor :age
  def initialize
    @age = 12
  end
  @age = 6
  def meow
    puts "I'm #{@age}"
  end
  def self.meow
    puts "I'm #{@age}, going on #{@age+1}"
  end    
end
Cat.age = 4 # => NoMethodError: undefined method `age=' for Cat:Class
p Cat.age # =? NoMethodError: undefined method `age' for Cat:Class
Cat.meow # => I'm 6, going on 7
cat = Cat.new
p cat.age # => 12
cat.meow # => I'm 12
cat.age = 20 # => 20
cat.meow # => I'm 20

如果我要添加

class << self
   attr_accessor :age
end

前三行输出将变为:

Cat.age = 4 # => 4
p Cat.age # => 4
Cat.meow # => I'm 4, going on 5
于 2013-09-18T04:47:05.997 回答
0

只需将 @values = [] 的声明放在初始化方法中,您的代码就应该按预期工作。

class DiceSet

  attr_reader :values
  def initialize()
     @values = []
  end

  def roll(number_of_rolls)
    (1..number_of_rolls).each do |roll|
      puts @values.class
      @values << (1..6).to_a.sample
    end
    return @values
  end
end
于 2013-09-18T07:06:49.680 回答