Ruby钩子方法继承相关 - 为什么@children更改为nil?

时间:2013-11-14 13:18:56

标签: ruby

Root类Shipping要记录其所有子节点。但是当一个班级孙子继承了海运的孩子时,会发生错误。有人知道为什么会这样吗?提前谢谢。

代码:

class Shipping
  @children = []
  def self.inherited(child)
    puts "#{child.name} inherit Shipping"
    @children << child
  end
  def self.show_children
    p @children
  end 
end

class Child1 < Shipping
end

class Child2 < Shipping
end

class Grandchild < Child2
end

Shipping.show_children

结果:

$ jruby temptry.rb
    Child1 inherit Shipping
    Child2 inherit Shipping
    Grandchild inherit Shipping
    NoMethodError: undefined method `<<' for nil:NilClass
        inherited   at temptry.rb:5
            (root) at   temptry.rb:18

1 个答案:

答案 0 :(得分:0)

当一个类继承另一个类时,这些方法是继承的,但是类实例变量没有特别初始化。您只为@children初始化了Shipping,但未对Grandchild进行初始化。

如果要在继承的类之间共享变量,那么您应该使用类变量。如果你这样做:

class Shipping
  @@children = []
  ...
end

并将所有@children更改为@@children,然后将共享这些内容。