ruby-on-rails - 在模块中扩展 self

标签 ruby-on-rails ruby

看起来这两段代码做同样的工作,但我想明白为什么我宁愿使用一个或另一个

第一个例子:

module MyModule 
  extend self

  def first_method
  end

  def second_method
  end

end

第二个例子:

module MyModule 

  def self.first_method
  end

  def self.second_method
  end

end

最佳答案

您的第一个示例定义了两个实例方法,并通过 extend 使它们也可用作类(或模块)方法:

module MyModule 
  def first_method; end
  def second_method; end
end

MyModule.instance_methods         #=> [:second_method, :first_method]
MyModule.methods - Module.methods #=> []

MyModule.extend MyModule

MyModule.instance_methods         #=> [:second_method, :first_method]
MyModule.methods - Module.methods #=> [:second_method, :first_method]

而您的第二个示例只定义了两个类(或模块)方法而没有实例方法:

module MyModule 
  def self.first_method; end
  def self.second_method; end
end

MyModule.instance_methods         #=> []
MyModule.methods - Module.methods #=> [:second_method, :first_method]

当您想提供一些可以调用的实用函数时,第一个变体会很有用:

MyModule.first_method

或者被包含在其他模块/类中:

class Foo
  include MyModule

  def another_method
    first_method     # <- no explicit receiver needed
  end
end

Ruby 还提供了辅助方法 module_function以这种方式定义方法:

module MyModule
  def first_method
  end
  module_function :first_method
end

它将方法添加为类方法并使实例方法私有(private)Kernel 中的方法就是这样工作的。

关于ruby-on-rails - 在模块中扩展 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55534581/

相关文章:

ruby-on-rails - Ruby on Rails 中的路由错误 "action: show"

ruby-on-rails - Rails hStore postgresql activerecord 数据库查询?

ruby-on-rails - Stripe gem - Discover、Diners Club 和 JCB 卡 - 您的卡不受支持

javascript - 半透明点上的附加颜色

ruby - 如何在 DataMapper 中按顺序使用聚合?

ruby-on-rails - gem "audited-activerecord"、 "~> 4.0 gives undefined method ` 审核'

mysql - 如何将 Time.zone 设置为 UTC 并保持这种状态?

ruby-on-rails - 使用activestorage的直接上传上传到S3时如何指定前缀?

ruby-on-rails - 无法在 Rails 5.1.2 项目上使用 Milia

ruby-on-rails - 复杂的选择集,Rails 方式?