gpt4 book ai didi

ruby-on-rails - ActiveSupport::Concern 应该包含或扩展

转载 作者:行者123 更新时间:2023-12-05 02:53:34 28 4
gpt4 key购买 nike

我知道 include 用于将模块方法作为实例方法访问,而 extend 用于将模块方法作为类方法访问。

对于 ActiveSupport::Concern 某处我看到写成,

module Test
include ActiveSupport::Concern
end

虽然在某些地方写成,

module Test
extend ActiveSupport::Concern
end

我的困惑是,ActiveSupport::Concern 应该与 include 还是与 extend 一起使用?

最佳答案

您需要使用 ActiveSupport::Concern 扩展模块,以便 ActiveSupport::Concern#included#class_methods 方法能够正常工作。

毕竟这两种方法几乎是它存在的唯一原因。

module A
extend ActiveSupport::Concern
# raises ArgumentError (wrong number of arguments (given 0, expected 1))
included do
puts "Hello World"
end
end

module B
extend ActiveSupport::Concern
included do
puts "Hello World"
end
end

class C
include B
end
# Outputs Hello World

看看如果我们检查 included 方法会发生什么:

module AB
include ActiveSupport::Concern
puts method(:included).source_location # nil
end
module ABC
extend ActiveSupport::Concern
puts method(:included).source_location # .../ruby/gems/2.7.0/gems/activesupport-6.0.2.1/lib/active_support/concern.rb
end

当我们用 ActiveSupport::Concern 扩展模块时,我们将它放在 ABC 的祖先链上,因此 ActiveSupport::Concern< 的方法 可用作 ABC 的模块方法。当您使用 include 并且调用的 included 方法实际上是 Module#included from the Ruby core 时,不会发生这种情况。 .

关于ruby-on-rails - ActiveSupport::Concern 应该包含或扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62169241/

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