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

Spe*_*ood 3 ruby module class

之间有什么区别

module Logging
  def self.log
    if @logger.nil?
      @logger = Logger.new STDOUT
    end
    @logger
  end
end
Run Code Online (Sandbox Code Playgroud)

和这个?

class Logging
  def self.log
    if @logger.nil?
      @logger = Logger.new STDOUT
    end
    @logger
  end
end
Run Code Online (Sandbox Code Playgroud)

他们似乎都在做同一件事。为什么我要选择一个?

Jör*_*tag 5

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


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

我们有时会用这个词谈论的某个图形时,“类方法”或“模块法”进出方便使用实例方法,但在Ruby中没有这样的概念。“类方法”和“模块方法”实际上只是对象的单例方法,而恰好是Module该类或Class该类的实例。有绝对的对象的单方法,其恰好是一个实例之间没有任何区别Class,Module,String,Array,Hash,Object,Foo,Bar,Whatever,或Garbledigookidoo。

哦。我有没有提到 单例方法也不存在。再说一遍,这是我们用于某些方法使用的词,但实际上它们只是对象的单例类的常规无聊的旧实例方法。

然而,“单件类的实例方法foo和”单例类的实例方法“ Foo这里Foo是一个实例Class是很长,所以我们缩短他们”的单法“ foo和”类方法“ Foo”出来的方便,充分了解这些是语言中实际上不存在的小说。

与Java具有三种不同类型的方法(实例方法,静态方法和构造函数(类似于方法的种类))不同,Ruby仅有一种方法:实例方法。没有类方法,没有模块方法,没有全局方法,没有顶级方法,没有静态方法,没有构造函数。但是,它确实具有三种类:常规类,单例类和包含类(后者是在您调用include或时综合并注入到继承层次结构中的类prepend)。这些类的主要区别在于方法是否喜欢Object#class,Class#superclass和Class#ancestors显示它们或抑制它们。单例类被所有它们抑制,包括前两个类,但由表示ancestors。