Ruby 模块中的“基础”是啥?

Posted

技术标签:

【中文标题】Ruby 模块中的“基础”是啥?【英文标题】:What is "base" in a Ruby Module?Ruby 模块中的“基础”是什么? 【发布时间】:2020-05-11 23:08:17 【问题描述】:

随着

def self.included(base)
end

钩子可以从included钩子内部访问包含类。到目前为止,我知道模块。但是我不是将base 作为参数传递给钩子吗?这是否意味着它也应该作为某种模块变量在整个Module 中可用,并且在模块中预先存在钩子?

它显然没有定义为类变量 (Module.class_variables)、实例变量 (Module.instance_variables) 或常量,因为它是小写的。

那么base 参数是什么?当你将它作为参数传递给模块钩子时,它只是“被召唤存在”吗?

@spickermann

2.6.0 :001 > module ConcernModule
2.6.0 :002?>   extend ActiveSupport::Concern
2.6.0 :003?>   included(base) do
2.6.0 :004 >       puts "base is #base"
2.6.0 :005?>     end
2.6.0 :006?>   end


Traceback (most recent call last):
        2: from (irb):1
        1: from (irb):3:in `<module:ConcernModule>'
NameError (undefined local variable or method `base' for ConcernModule:Module)

谢谢

【问题讨论】:

你看过docs for included吗? 文档说关注中的included 也有一个base 参数,但是当我尝试像included(base) do ... apidock.com/rails/ActiveSupport/Concern/included 一样调用它时,我收到一条错误消息 NameError(ConcernModule:Module 的未定义局部变量或方法“基”)。谢谢。 请发表您的疑虑、您如何将您的疑虑纳入课堂以及您收到的错误消息。 【参考方案1】:

Module#included一个回调,它从 Module#include 调用,显式地将 self 作为参数传递给方法。

【讨论】:

以上是关于Ruby 模块中的“基础”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 模块中的 mattr_accessor 是啥?

Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]

Ruby 中的私有模块方法

为 Ruby 模块中的每个方法调用执行代码

Ruby模块中的动态覆盖类方法

Object Ruby 中的模块方法