2014-12-02 54 views
1

我想知道这样的事情是否可能在红宝石中。红宝石类的遗体继承

# file a.rb 
class A 
    puts self 
end 

# file b.rb 
require 'a' 
class B < A; end 

# file run.rb 
puts 'start' 
require 'a' 
puts 'between' 
require 'b' 
puts 'end' 

# expected output 
$ ruby run.rb 
# => start 
# => A 
# => between 
# => B 
# => end 

# what i've got 
# => start 
# => A 
# => between 
# => end 

我希望在需要时将类保持不变。但我想实现这一次,然后在儿童班重复这一点,而无需触摸代码。

+0

据我了解你的问题,这是'require'的默认行为。你有没有尝试运行你的代码? – 2014-12-02 14:06:44

+0

首先,我正在玩irb,但现在我试图用单独的文件运行它,但仍然不能按我的想法运行。 我在运行类的输出中增加了一些调试功能,我得到了这个结果:'#=> start#=> A#=>#=> end' 应该有'#=> B' #=>结束'打印。 – SZMER 2014-12-02 14:12:52

回答

5

它不输出B,因为已经评估了包含puts self的A类块。当从类继承它时,它不会重新评估类A的主体。

在广泛的笔画中,您可以将Ruby类看作是从中查找方法的散列数组。当您继承一个类时,您会在查找列表中推送新的方法散列。

话虽这么说,在Class#inherited功能将允许你这样做,你在寻找什么:

class A 
    def self.inherited(klass) 
    puts klass 
    end 
end 

class B < A 
end 

另请注意模块有两个相关的方法:Module#includedModule#extended

+0

如果你想要这个功能,但具有旧的继承行为,你可以在覆盖'inherited':'alias_method:old_inherited,:inherited'之前在'class A'中设置一个别名方法。然后,'put klass'后,你可以调用'old_inherited'。 – aceofbassgreg 2014-12-02 19:16:24