0

ノード クラスとプレーヤー クラスを次のように定義しました。

class Node < OpenStruct
  def initialize(parent,tag,&block)
    super()
    self.parent = parent
    self.parent.children << self unless parent.nil?
    self.children = []
    self.tag = tag
    instance_eval(&block) unless block.nil?
  end
end

class Player < Node
  def initialize(parent)
    Node.new(parent,:player) do 
      self.turn_num = 1
    end
  end
end

インスタンス変数 player はによって作成されました

player = Player.new(room) # room is the parent node which was defined
puts player.turn_num

そして、私はエラーを受け取りました:

in `method_missing': undefined method `[]' for nil:NilClass (NoMethodError)

どこが間違っていたのかを理解するのを手伝ってもらえますか? ありがとう!

編集:

問題は、Player クラスの初期化にあるはずです。コードを変更しました

class Player < Node
      def self.new(parent)
        Node.new(parent,:player) do 
          self.turn_num = 1
        end
      end
 end

するとエラーが出ない。ここで初期化して何が悪いの?

4

1 に答える 1

1

Player インスタンスはすでに Node インスタンスでもあるため、Player 内で Node を初期化する必要はありません。代わりに、予想される引数を に渡す必要がありますsuper

class Player < Node
  def initialize(parent,&block)
    super(parent, :player, &block)
    self.turn_num = 1
  end
end

一般に、オーバーライドするのはお勧め.newできません。これは、すべての Ruby オブジェクトがメモリを割り当ててから初期化メソッド (存在する場合) を実行するようにデフォルトで定義されています。としてオーバーライドすると、インスタンスではなく、self.newベア インスタンスが返されます。NodePlayer

于 2012-11-18T06:23:46.057 に答える