3

我正在做以下 Ruby 教程 http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/48-advanced-modules/lessons/118-wrapping-up-modules

其中一项练习要求我

...在模块 Math 中定义一个静态方法 square。它显然应该返回传递给它的数字的平方......

为什么只有当我在方法定义前加上“self”前缀时它才有效?例如以下作品:

module Math
  def self.square(x)
    x ** 2
  end
end

但以下不起作用:

module Math
  def square(x)
    x ** 2
  end
end

为什么是这样?作为参考,该方法被称为puts Math.square(6)

4

2 回答 2

6

在模块的上下文中,将方法声明self为前缀使其成为模块方法,无需模块includeextend使用模块即可调用。

如果你想拥有默认的混合方法和需要self前缀的模块方法,你可以这样做:

module Math
  # Define a mix-in method
  def square(x)
    x ** 2
  end

  # Make all mix-in methods available directly
  extend self
end

这应该具有通过直接调用使这些方法可用的效果Math.square

于 2013-04-25T14:28:26.677 回答
0

在方法定义中,如果您没有self.,那么它是在该类的实例上定义的。由于Math不是 的实例Math,因此没有它就无法工作。

于 2013-04-25T14:28:16.040 回答