gpt4 book ai didi

ruby-on-rails - 重新定义 self.included 和将 block 传递给 included 之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:27 25 4
gpt4 key购买 nike

有什么区别

module A
def self.included(klass)
puts klass
end
end

module A
include ActiveSupport::Concern
included do
puts self
end
end

哪个更好,什么时候用哪个?

最佳答案

两个片段产生相同的结果。但是,有一个很小但很重要的区别。

第一个代码是纯 Ruby。这意味着它将在没有任何依赖的情况下工作。

第二段代码依赖于外部依赖的ActiveSupport。如果你想使用它,你需要在你的项目中包含这个 gem。在 Rails 应用程序中,几乎没有开销,因为应用程序已经依赖于 ActiveSupport。但在非 Rails 应用程序中,这可能不方便。

此外,ActiveSupport::Concern 所做的不仅仅是为 Ruby 包含的钩子(Hook)添加一些语法糖。事实上,此类模块的主要作用是管理模块之间的多个依赖关系。

在 Rails 代码库中,将一小部分功能定义到单独的模块中是很常见的。一个很好的例子是 ActiveSupport 本身。但是,您可能认为功能 A 可能需要模块 B 中定义的某些功能,因此如果您在代码中包含 B,则该模块应确保还要求并混合 A,否则您的代码将崩溃。

它还基于包含的钩子(Hook)实现了一个非常常见的模式:类级扩展。以下 Ruby 代码

module A
def self.included(base)
base.extend ClassMethods
end

module ClassMethods
def bar
"bar"
end
end
end

class Foo
include A
end

Foo.bar
# => "bar"

成为

module A
extend ActiveSupport::Concern

module ClassMethods
def bar
"bar"
end
end
end

class Foo
include A
end

Foo.bar
# => "bar"

我个人的建议是避免使用 ActiveSupport::Concern if

  • 您不需要使用它的高级功能
  • 你正在编写的代码,可以很容易地用一些代码编写,而不依赖于 Concern
  • 该应用尚未包含 ActiveSupport 作为依赖项

关于ruby-on-rails - 重新定义 self.included 和将 block 传递给 included 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20672167/

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