有什么区别
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
的单例类的实例方法,其中Foo
是Class
的一个实例”实在是太长了,所以我们将它们缩短为“foo
的单例方法”和“Foo
的类方法”是出于方便,非常清楚那些小说在语言中实际上并不存在。
与具有三种不同类型的方法(实例方法、静态方法和构造函数(有点像方法))的 Java 不同,Ruby 只有一种方法:实例方法。没有类方法,没有模块方法,没有全局方法,没有顶级方法,没有静态方法,没有构造函数。但是,它确实具有三种类:常规类、单例类和包含类(后者是在您调用 include
或 prepend
时合成并注入(inject)到继承层次结构中的类)。这些类的主要区别在于 Object#class
、 Class#superclass
和 Class#ancestors
等方法是显示它们还是抑制它们。单例类被所有它们抑制,包括前两个类,但显示为 ancestors
。
关于ruby - Ruby 中模块方法和类方法之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407583/