English 中文(简体)
为什么在Ruby中包含模块的顺序会有所不同?
原标题:
  • 时间:2008-12-03 12:10:49
  •  标签:

这个问题最好用一个代码示例来总结:

module TestOne
  module Foo
    def foo
      42
    end
  end

  module Bar
    include Foo
  end

  class Quux
    include Bar
  end
end

TestOne::Bar.ancestors # => [TestOne::Bar, TestOne::Foo]
TestOne::Quux.ancestors # => [TestOne::Quux, TestOne::Bar, TestOne::Foo, Object, Kernel]
TestOne::Quux.new.foo # => 42

module TestTwo
  class Quux
  end

  module Bar
  end

  module Foo
    def foo
      42
    end
  end
end

TestTwo::Quux.send :include, TestTwo::Bar
TestTwo::Bar.send :include, TestTwo::Foo

TestTwo::Bar.ancestors # => [TestTwo::Bar, TestTwo::Foo]
TestTwo::Quux.ancestors # => [TestTwo::Quux, TestTwo::Bar, Object, Kernel]
TestTwo::Quux.new.foo # => 
# ~> -:40: undefined method `foo  for #<TestTwo::Quux:0x24054> (NoMethodError)

我觉得当你在一个类 Foo 中包含一个模块 (例如 Bar) 时,Ruby 存储的仅仅是 Foo 包含 Bar 的事实。因此,当你在 Foo 上调用一个方法时,它会在 Bar 中查找该方法。

如果那是真的,到调用TestTwo::Quux.new.foo的时候,我已经将foo方法混合到了TestTwo::Bar中,所以它应该可以工作,对吧?

最佳回答

文档指出,append_features(由include调用)将方法混入调用者中。因此,当TestTwo :: Quux包含TestTwo :: Bar时,不会向TestTwo :: Quux添加任何方法。下一行将方法添加到TestTwo :: Bar,但不添加到TestTwo :: Quux

问题回答

暂无回答




相关问题
热门标签