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

次に、koan は私の DiceSet クラスを次のように使用します。

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

@values インスタンス変数で何が起こっているかを追跡するために puts コマンドをそこに配置しましたが、最初の puts @values.class だけがその配列クラスを示しています。他のすべては NilClass を返しています。インスタンス変数を間違って使用していますか、それとも他に何か不足していますか? メソッド呼び出し後にインスタンス変数の割り当てが解除されますか?

編集: @values = [] を以下に示すようにロール メソッドに配置したので、私のクラスは正しく動作します。私の唯一の質問は、初期化メソッドに @values = [] を入れたときに、roll メソッドが @values を配列ではなく NilClass と見なす理由です。

4

4 に答える 4

0

DiceSetインスタンスには独自の@valuesがあり、さらにクラスDiceSetにも独自の があり@valuesます。それらはすべて互いに異なっています。インスタンスとクラスで同じ変数を共有する場合は、クラス変数を使用する必要があります@@values

于 2013-09-18T04:17:01.057 に答える