加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – self.included – 包括Ruby中模块的类方法

发布时间:2020-12-17 03:10:45 所属栏目:百科 来源:网络整理
导读:我读了这篇文章: Ruby modules – included do end block – 但是当你在模块中使用self.included do … end block时仍然没有得到. 帖子说当你包含模块时,块中的代码将被运行,但是如果要包含模块的唯一目的,那么它的重点是什么?这个代码不需要运行吗?该块
我读了这篇文章: Ruby modules – included do end block – 但是当你在模块中使用self.included do … end 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,因为模块没有范围类方法.包含模块后,self.some_class_method将不会在包含类中提供.

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

如果要包含模块的唯一目的,那么我们的意思是什么呢?

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

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

从理论上讲,Ruby可以自动将模块中定义的所有类方法添加到包含类中,但实际上这是一个坏主意,因为您不再需要选择是否要包含类方法 – 所有类方法都将包含在每个方法中时间,无论是否打算包括在内.考虑这个例子:

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,因为它的目的是设置模块对象的配置.然而,如果我们有类方法的自动包含,你将无法阻止它被包括在内.

但是所有实例方法都已包含在内!那怎么样呢?

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

模块上的“类”方法是不同的,因为它可以在模块本身上调用,因此无论它是否也添加到包含类,它都可以正常使用.这就是为什么你有一个选择更好的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读