【问题标题】:What is a Ruby method definition with context?什么是带有上下文的 Ruby 方法定义?
【发布时间】:2011-12-24 15:46:48
【问题描述】:

最近我遇到了一些看起来像这样的 Ruby 代码:

module SomeModule
  class SomeClass
    def hire_an_employee business
      # do stuff
    end
  end
end

我以前从未见过这种 def 语法。

在 Pickaxe 书中,方法定义如下:

def defname⟨(⟨,arg⟨,=val⟩⟩∗ ⟨,&blockarg⟩) ⟩
  body
end

它声明“defname 既是方法的名称,也可以是它有效的上下文。”但是它似乎没有提供任何进一步的解释。

我的问题是:有人可以通过上下文更好地解释此方法定义并举例说明如何使用它吗?

【问题讨论】:

    标签: ruby syntax methods


    【解决方案1】:

    给定:

    module SomeModule
      class SomeClass
        def hire_an_employee business
          # do stuff
      end
    end
    

    使用“hire_an_employee”功能

    k = SomeModule::SomeClass.new
    k.hire_an_employee "woot"
    

    Ps:括号可以省略。

    def foo(a)
      #do stuff
    end
    

    等同于:

    def foo a
      #do stuff
    end
    

    【讨论】:

      【解决方案2】:

      代码示例在module 中定义了一个类。该类有一个名为hire_an_employee 的方法,采用单个参数business。方法定义本身没有什么不寻常的地方,除非您指的是缺少的括号。

      在定义方法(和调用方法,除非需要消除歧义)时,Parens 是可选的。

      “上下文”部分意味着defname 可以包含一个上下文,例如self,以定义一个类(而不是实例)方法。

      class Foo
        def self.ohai
          p "kthxbai"
        end
      end
      
      > Foo.ohai
      kthxbai
      > Foo.new.ohai
      NoMethodError: undefined method 'ohai' ...
      

      【讨论】:

      • 啊,谢谢!我没有意识到括号对于参数是可选的。对于我的示例,我认为业务是一个上下文,并试图找出它的语义。
      • 我认识很多 Ruby 开发人员,如果您在接受不超过零参数的方法的定义中省略括号,他们会觉得您很有趣。认为它们在语法上是可选的,但通常是强制性的。 :-)
      • @BrianWong 是的,我想知道这是否让你失望了——我应该明确地说些什么。
      • @sheldonh 大多数开发人员都觉得我很有趣,不管是什么语言。
      猜你喜欢
      • 2015-12-11
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2012-02-25
      相关资源
      最近更新 更多