gpt4 book ai didi

ruby-on-rails - 如何在使用 Ruby on Rails ActiveSupport::Concern 功能时包含模块 "nest"?

转载 作者:数据小太阳 更新时间:2023-10-29 06:56:05 26 4
gpt4 key购买 nike

我正在使用 Ruby 1.9.2 和 Ruby on Rails v3.2.2 gem。我想“嵌套”模块的包含,因为我正在使用 RoR ActiveSupport::Concern功能,但我怀疑我应该在哪里声明 include 方法。也就是说,我有以下内容:

module MyModuleA
extend ActiveSupport::Concern

# include MyModuleB

included do
# include MyModuleB
end
end

应该我在 MyModuleA 的“正文”/“上下文”/“范围”中声明 include MyModuleB 或者我应该声明包含的 do ... end block ? 有什么区别,我应该从中得到什么?

最佳答案

如果您在 MyModuleA 的“主体”中包含 MyModuleB,那么扩展 B 功能的是模块本身。如果您将它包含在 included block 中,那么它会包含在混合在 MyModuleA 中的类中。

即:

module MyModuleA
extend ActiveSupport::Concern
include MyModuleB
end

产生类似的东西:

MyModuleA.send :include, MyModuleB
class Foo
include MyModuleA
end

同时

module MyModuleA
extend ActiveSupport::Concern
included do
include MyModuleB
end
end

产生类似的东西:

class Foo
include MyModuleA
include MyModuleB
end

原因是 ActiveSupport::Concern::included 类似于:

def MyModuleA
def self.included(klass, &block)
klass.instance_eval(&block)
end
end

included block 中的代码在包含类的上下文中运行,而不是在模块的上下文中运行。因此,如果 MyModuleB 需要访问它正在混入的类,那么您需要在 included block 中运行它。否则,实际上是同一件事。

通过演示:

module A
def self.included(other)
other.send :include, B
end
end

module B
def self.included(other)
puts "B was included on #{other.inspect}"
end
end

module C
include B
end

class Foo
include A
end

# Output:
# B was included on C
# B was included on Foo

关于ruby-on-rails - 如何在使用 Ruby on Rails ActiveSupport::Concern 功能时包含模块 "nest"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com