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,您只是返回一个裸Node实例,而不是Player实例。

于 2012-11-18T06:23:46.057 回答