gpt4 book ai didi

ruby-on-rails - self.included——包含来自 Ruby 模块的类方法

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

我读了这篇文章:Ruby modules - included do end block – 但仍然不知道何时会在模块中使用 self.included do ... end block 。

该帖子说,当您包含模块时, block 中的代码将运行,但如果包含模块的唯一目的是什么,那有什么意义呢?无论如何都不需要运行该代码吗?为了运行该代码,不需要该 block ,对吧?

下面这两个有什么区别:

module M
def self.included(base)
base.extend ClassMethods
base.class_eval do
scope :disabled, -> { where(disabled: true) }
end
end

module ClassMethods
...
end
end

对比

module M
def self.some_class_method
...
end

scope :disabled, -> { where(disabled: true) }
end

最佳答案

这两个例子有什么区别?

第一个代码块将 ClassMethods 中的类方法添加到包含的类中,并在其上调用 scope 方法。第二个不执行任何这些操作,并且会导致 NoMethodError,因为该模块没有 scope 类方法。一旦包含模块,self.some_class_method 将无法在包含的类上使用。

有关模块包含如何在 Ruby 中工作的完整故事,请在此处阅读我的回答:
Inheriting class methods from modules / mixins in Ruby

如果模块的唯一目的是包含,self.included 有什么意义?

包含并不是模块的唯一目的。它们还用于其他用途,例如命名空间或简单地存储各种类方法,然后可在模块本身上调用。

为什么 Ruby 不自动包含类方法?

理论上 Ruby 可以自动将模块中定义的所有类方法添加到包含的类中,但实际上这不是一个好主意,因为您将无法再选择 strong> 是否要包含类方法——每次都会包含所有类方法,无论它们是否打算包含在内。考虑这个例子:

module M
def self.class_method
"foo"
end

def self.configure_module
# add configuration for this module
end
end

class C
include M
end

这里,configure_module 方法显然不应该添加到 C 中,因为它的目的是为模块设置配置目的。然而,如果我们对类方法进行自动包含,您将无法阻止它被包含。

但是所有的实例方法都已经包括在内了!那怎么样?

模块中的实例方法只有在包含在类中时才真正有用,因为模块不能有实例,只有类可以。因此,在一个模块中,每个实例方法都应该包含在某个地方才能工作。

模块上的“类”方法是不同的,因为它可以在模块本身上调用,所以无论它是否也被添加到包含类中,它都可以正常使用。这就是为什么您最好在那里进行选择。

关于ruby-on-rails - self.included——包含来自 Ruby 模块的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108759/

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