Ruby on rails Ruby类继承
我定义了节点类和播放器类,如下所示:Ruby on rails Ruby类继承,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我定义了节点类和播放器类,如下所示: 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(&bloc
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
我得到了一个错误:
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
class-Player
那个么就并没有错误了。这里的初始化有什么问题吗?您不需要在播放器内部初始化节点,因为任何播放器实例都已经是节点实例了。相反,您应该将预期参数传递到
super
:
class Player < Node
def initialize(parent,&block)
super(parent, :player, &block)
self.turn_num = 1
end
end
class-Player
通常,重写
.new
,这是一个坏主意——默认情况下为所有Ruby对象定义的,用于分配内存,然后运行initialize方法(如果存在)。当您将其覆盖为self.new
时,您只返回一个裸节点
实例,而不是播放器
实例。错误消息是不言自明的:您有一个nil
,您正试图用它来做一些事情。@picklishdoor>当然。我想知道在哪里产生了一个零。我发现这个球员不是一个好球员nil@PicklishDoorknob.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/ostruct.rb:174:inmethod_missing:test中nil:NilClass(nomethoderor)的未定义方法
class Player < Node
def initialize(parent,&block)
super(parent, :player, &block)
self.turn_num = 1
end
end