我试图了解在多个 Mixin 中使用时的 include
语句行为。也就是说,我有这些陈述:
class Article < ActiveRecord::Base
include DoubleIncludedModule
include AModule
# ...
end
module AModule
include DoubleIncludedModule
# ...
end
module DoubleIncludedModule
# ...
end
DoubleIncludedModule
类中包含多少次 Article
?也就是说,由于 DoubleIncludedModule
的“后续”包含(首先在 Article
类中,然后在 AModule
类本身包含的 Article
中),将是 Ruby 自动处理的“双重包含”问题,或者 DoubleIncludedModule
(错误地)包含两次?当然,我只想包含一次
DoubleIncludedModule
模块。我怎样才能(也许通过使用一些 Ruby on Rails 方法)以正确的方式做到这一点? 最佳答案
我举个例子来回答:
module A
def self.included base
puts "A included in #{base}"
end
end
module B
include A
def self.included base
puts "B included in #{base}"
end
end
class C
include A
include B
end
p C.ancestors
打印A included in B
A included in C
B included in C
[C, B, A, Object, Kernel, BasicObject]
正如我们所见,A
只包含一次到 C
中。虽然从技术上讲它被包含两次,因为它被包含在 B
中,而 C
也被包含在 included
中。这有关系吗?可能不会。每个仍然只在祖先链中出现一次,并且任何方法都会被等效的实现覆盖——即,本质上是一个无操作。除非您正在使用 ojit_code 钩子(Hook)做一些奇特的事情,否则您不太可能注意到任何事情。关于ruby-on-rails - 了解 `include` 混合模块的 "subsequent"语句行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12594760/