gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:19:43 24 4
gpt4 key购买 nike

有什么区别

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com