我想知道,为什么包含的模块的方法会混合到任何后续的类定义中(就好像该类将其包含在自身中一样)?
module Foo
def bar
print "#{self}\n"
end
end
class Bar
end
begin
Bar.bar
rescue NoMethodError
puts "There is no Bar.bar\n"
end
include Foo
bar
Bar.bar
Bar.new.bar
打印:
There is no Bar.bar main Bar #<Bar:0xb73f2048>
这是预期的行为吗?为什么?
最佳答案
当您在程序中但在任何类或方法之外包含 Foo 时,它将包含在当前作用域中,即 main
对象。
您可以通过将 bar 方法修改为以下内容来测试这一点
def bar
print "InBar class: #{self.class} value: #{self}\n"
end
然后在最后添加以下两行
2.bar
Fixnum.bar
这将为您提供以下输出
There is no Bar.bar
InBar class: Object value: main
InBar class: Class value: Bar
InBar class: Bar value: #<Bar:0x21ecec>
InBar class: Fixnum value: 2
InBar class: Class value: Fixnum
关于ruby - ruby mixin 中奇怪的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325741/