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

Ruby中模块方法和类方法的实际区别是什么?,ruby,class,module,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 他们似乎都做了同

两者的区别是什么

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

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

模块是关于提供可以跨多个类使用的方法的——将它们视为“库”(正如您在Rails应用程序中看到的那样)。类是关于对象的;模块是关于函数的


请参见

模块与类相似,因为它们包含方法、常量以及其他模块和类定义的集合。与类不同,不能基于模块创建对象

模块有两个用途。首先,它们充当名称空间,允许您定义名称不会与其他地方定义的名称冲突的方法。其次,它们允许您在类之间共享功能。如果一个类混合在一个模块中,那么该模块的实例方法将变得可用,就像它们是在类中定义的一样。多个类可以混合在同一个模块中,在不使用继承的情况下共享模块的功能。您还可以将多个模块混合到一个类中


类用于创建对象。

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


Ruby中没有“类方法”或“模块方法”。Ruby只有一种方法:实例方法

在谈到使用实例方法的特定模式时,我们有时出于方便而使用“类方法”或“模块方法”,但Ruby中没有这样的概念。“类方法”和“模块方法”实际上只是对象的单例方法,而对象恰好是
模块
类或
类的实例。对象的单例方法正好是
模块
字符串
数组
散列
对象
Foo
任何东西
,或
Garbledigookidoo>

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

但是,
foo
的单例类的实例方法和
foo
的单例类的实例方法,其中
foo
class
的一个实例,确实很长,为了方便,我们把它们缩短为
foo
的单例方法和
foo
的类方法,很清楚这些都是虚构的,在语言中并不存在


与Java不同,Java有三种不同的方法(实例方法、静态方法和构造函数(有点像类方法)),Ruby只有一种方法:实例方法。没有类方法,没有模块方法,没有全局方法,没有顶级方法,没有静态方法,没有构造函数。但是,它有三种类型的类:常规类、单例类和包含类(后者是在调用
include
prepend
时合成并注入继承层次结构的类)。这些类的区别主要在于像
对象#类
类#超类
类#祖先
这样的方法是显示它们还是抑制它们。单例类被所有类所抑制,包括前两个类,但由
祖先

Jörg Mittag显示,从技术上讲,没有类方法或模块方法是正确的。然而,我将假设“类方法”是指“在类实例的单例类上定义的实例方法”,而“模块方法”是指“在模块实例的单例类上定义的实例方法”

两者之间没有功能上的区别。两者都定义了命名空间中的方法

在实践中,您会发现它们往往用于不同的目的。例如,类方法通常用于指定不同的方法来构造对象,例如
Puzzle.from_textfile
。模块方法只是放在单个命名空间中的全局函数,因为它们在逻辑上是相关的,例如
Math.sin
Math.abs


还需要注意的是,Ruby还具有“模块函数”的概念,这与这个问题无关。术语“模块函数”是指模块上具有相同私有实例方法的类方法。这些程序可以使用模块.MuleMeLoFiels以编程方式创建,并且在模块被用作命名空间和混合函数(例如,代码>数学< /代码>)时是有用的。问题是要澄清类方法和模块方法之间的区别,而不是类和模块之间的区别。Ruby的模块就是一个只包含模块方法的模块示例(通过
include
-ing模块,没有实例方法与类的实例方法混合)。模块方法有时被称为“helper”方法。类不必
包含
模块来调用其模块方法。它们只是直接引用;例如,
x=Math.sqrt(2)
。哦,是的,谢谢你的评论。也可以这样做我的观点是,当你包含一个模块时,只包含实例方法;Ruby只是跳过了模块方法,因此
include
在这里是不相关的。这个问题是关于模块方法和类方法之间的区别,而不是模块和类之间的区别。你能解释一下类方法是什么吗