类的实例方法与模块方法

3

我正在阅读有关Ruby模块方法的解释,以及它们与类的实例方法不同之处。以下是我正在阅读的解释:

请记住,与实例方法不同,模块方法需要在模块本身上定义。如何访问模块?请回想起,在模块定义内部,self指的是正在定义的模块。因此,您将需要使用self.xxx的形式来定义该方法。

我并不完全理解。当我们在类中定义方法时,我们不必在类本身上定义它。我们仅仅在类的实例化对象上调用它。

为什么我们需要使用术语“self”在模块本身上定义模块方法?这样做的目的是什么?我们为什么不能不使用术语self来定义模块方法?以下是我的模块框架:

module GameTurn

    def self.take_turn(player)

    end
1个回答

7

有两种类型的module方法:

  • 旨在混合到其他模块或类中的方法:“Mixins”
  • 旨在直接使用的方法:“Exposed Methods”

例如:

module Example
  def self.exposed_method
    # This method is called as Example.exposed_Method
  end

  def mixin_method
    # This method must be imported somewhere else with include or extend
    # or it cannot be used.
  end
end

在一个 class 中,你有两种方法:

  • 那些仅在 实例 上被调用的方法: "实例方法"
  • 那些直接在类上被调用的方法:"类方法"
    • 在其他语言中,这些也被称为 "静态方法"。

例如:

class ExampleClass
  def self.class_method
    # This can be called as ExampleClass.class_method
  end

   def instance_method
     # This can only be called on an instance: ExampleClass.new.instance_method
   end
end

好的,让人困惑的是我的take_turn方法将在一个对象上使用,因此它似乎不会直接使用?它似乎与其他类/对象混合在一起。那么为什么我需要使用self来定义它呢? - Jwan622
这取决于你如何使用它。如果你使用适当的面向对象设计模式,那么你可能会以不同的方式组织你的代码。如果你想让该方法在被导入到另一个上下文之后仍然能够独立使用,那么你应该使用self来定义它。 - tadman
2
冒着混淆tadman的简洁明了的答案的风险,如果在ExampleClass中添加include Example(或在定义类之后调用ExampleClass.include Example),则可以使用实例方法Example#mixin_method,就像您在类中定义它一样,但是您不会“获得”模块方法Example.exposed_method,即您无法调用ExampleClass#.exposed_method。您必须使用Example.exposed_method。有一种方法可以将模块mixin方法作为类方法引入类中,但是在您的Ruby教育阶段,您不必担心这个问题。 - Cary Swoveland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接