ruby - Ruby 中模块方法和类方法之间的实际区别是什么?

标签 ruby class module

有什么区别

module Logging
  def self.log
    if @logger.nil?
      @logger = Logger.new STDOUT
    end
    @logger
  end
end

还有这个?

class Logging
  def self.log
    if @logger.nil?
      @logger = Logger.new STDOUT
    end
    @logger
  end
end

他们似乎都在做同样的事情。我为什么要选择一个而不是另一个?

最佳答案

tl;dr:Ruby 中没有类方法和模块方法,只有实例方法。考虑到它们都只是实例方法,因此是同一件事,不可能有任何区别。


Ruby 中没有“类方法”或“模块方法”这样的东西。 Ruby 只有一种方法:实例方法。

在谈论使用实例方法的特定模式时,我们有时出于方便使用“类方法”或“模块方法”,但实际上并没有这样的方法Ruby 中的概念。 “类方法”和“模块方法”实际上只是对象的单例方法,恰好是 Module 类或 Class 类的实例。 There is absolutely no difference whatsoever between a singleton method of an object which happens to be an instance of Class , Module , String , Array , Hash , Object , Foo , Bar , Whatever , or Garbledigookidoo .

哦。我提到了吗?单例方法也不存在。同样,我们用这个词来表示某些类型的方法用法,但它们实际上只是一个对象的单例类的常规无聊的旧实例方法。

但是,“foo的单例类的实例方法”和“Foo的单例类的实例方法,其中FooClass的一个实例”实在是太长了,所以我们将它们缩短为“foo的单例方法”和“Foo 的类方法”是出于方便,非常清楚那些小说在语言中实际上并不存在。

与具有三种不同类型的方法(实例方法、静态方法和构造函数(有点像方法))的 Java 不同,Ruby 只有一种方法:实例方法。没有类方法,没有模块方法,没有全局方法,没有顶级方法,没有静态方法,没有构造函数。但是,它确实具有三种类:常规类、单例类和包含类(后者是在您调用 includeprepend 时合成并注入(inject)到继承层次结构中的类)。这些类的主要区别在于 Object#classClass#superclassClass#ancestors 等方法是显示它们还是抑制它们。单例类被所有它们抑制,包括前两个类,但显示为 ancestors

关于ruby - Ruby 中模块方法和类方法之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407583/

相关文章:

ruby - 无法通过 Ruby 执行历史命令

Ruby,如何将一个参数添加到一个你不知道它是否已经有任何其他参数的 URL

c++ - 包含另一个类的对象的类的大小

javascript - 类的属性名称是什么?

javascript - 创建工具链的方法比较 : JS modules/loader/build

ruby - 多个结果?样式 if 子句

ruby-on-rails - Rails 模型到递归 json

android - 如何访问和引用全局类中的变量和函数

Excel VBA 将数据写入类模块中的字典

python reload() 没有任何效果?