之间有什么区别
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)
他们似乎都在做同一件事。为什么我要选择一个?
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。
| 归档时间: |
|
| 查看次数: |
1808 次 |
| 最近记录: |