【问题标题】:Why prefix a method with "self"为什么要在方法前加上“self”
【发布时间】:2013-04-19 12:05:53
【问题描述】:

我正在做以下 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)

【问题讨论】:

标签: ruby self


【解决方案1】:

在模块的上下文中,以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 使这些方法可用的效果。

【讨论】:

  • 谢谢!因此,如果我理解正确,不使用“self”声明将迫使我在任何我想使用它的地方使用 include 或 extend 之类的 mixin……而使用“self”声明将允许我像 MyModule.MyMethod 一样调用它?跨度>
  • 没错。类似的事情发生在类上,只是你继承而不是includeextend
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2020-09-27
    • 2012-08-08
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多