有一个模块MyModule:

module MyModule

  extend ActiveSupport::Concern

  def first_method
  end

  def second_method
  end

  included do
    second_class_method
  end

  module ClassMethods
    def first_class_method
    end

    def second_class_method
    end
  end
end

当一些类include打开这个模块时,它将有两个方法作为实例方法(first_methodsecond_method)和两个类方法(first_class_methodsecond_class_method)公开——这很清楚.

据说

included块将在

这到底是什么意思?也就是说,这个方法(second_class_method)具体什么时候执行?

推荐答案

下面是一个实际的例子.

class MyClass
  include MyModule
end

当您将模块包含在类中时,将调用included钩子.因此,second_class_method将在Class的范围内调用.

这里发生的是

  1. first_methodsecond_method被包括为MyClass.的实例方法

    instance = MyClass.new
    instance.first_method
    # => whatever returned value of first_method is
    
  2. ClassMethods的方法自动混合为MyClass的类方法.这是一个常见的Ruby模式,ActiveSupport::Concern封装.非Rails Ruby代码是

    module MyModule
      def self.included(base)
        base.extend ClassMethods
      end
    
      module ClassMethods
        def this_is_a_class_method
        end
      end
    end
    

    结果

    MyClass.this_is_a_class_method
    

    还是你的情况

    MyClass.first_class_method
    
  3. included是一个有效连接到以下代码的钩子

    # non-Rails version
    module MyModule
      def self.included(base)
        base.class_eval do
          # somecode
        end
      end
    end
    
    # Rails version with ActiveSupport::Concerns
    module MyModule
      included do
        # somecode
      end
    end
    

    对于常见模式来说,它主要是"语法糖".实际上,当您混合模块时,代码会在mixer类的上下文中执行.

Ruby相关问答推荐

R10K模块在try 安装gem r10k时获得错误的Ruby版本

每次调用返回新的 REST 响应的 Ruby Rspec class_double

如何在 Shopify 脚本编辑器中显示数组值?

如何在 rspec 中使用 `eq` 匹配器和 `hash_include` 匹配器来获取哈希数组

如何判断一个对象在 Ruby 中是否可迭代?

这些 Ruby 命名空间约定之间有什么区别?

`expect`测试中的Rspec`eq`与`eql`

有效的Electron邮件地址正则表达式?

如何让 Ruby 解析时间,就好像它在不同的时区一样?

Sinatra 是多线程的吗?

警告! PATH 设置不正确,通常这是由 shell 初始化文件引起的

升级到 Rubygems 1.5.0 后,Bundler 抛出未初始化的常量 Gem::SilentUI (NameError) 错误

使用 Ruby 将大写字符串转换为标题大小写

Sublime Text 2 控制台输入

如何合并 Ruby 哈希

我们什么时候在 Rails 中使用 "||=" 运算符?它的意义是什么?

我安装了一个 gem,但 require 'gemname' 不起作用.为什么?

Lisp 和 Erlang 原子、Ruby 和 Scheme 符号.它们有多大用处?

为什么表达式 (true == true == true) 会产生语法错误?

将 lambda 作为块传递