在Ruby中的方法之前调用方法?

时间:2015-09-17 23:53:24

标签: ruby

我是Ruby的新手,我看到的方法定义如下:

def method_one
  puts "method 1"
end

class MyClass
  method_one
  def method_two
    puts "method 2"
  end
end

使用method_one的方式让我想起了Python装饰器。

的输出
c = MyClass.new
c.method_two

  

方法1

     

方法2

我一直在尝试在网络上的Ruby文档中搜索有关此语法/语言功能的更多信息,但我不知道要搜索的关键字。

这叫做什么?

3 个答案:

答案 0 :(得分:2)

TL; DR

此代码不符合您的想法。不要做这样的事情。

Ruby的顶级对象

Ruby允许您定义类外的方法。这些方法存在于顶级对象上,您可以(通常)将其视为一种全能命名空间。你可以看到What is the Ruby Top-Level?之类的各种帖子了解更多细节,但你真的不需要关心。

在您的原始帖子中, method_one 只是顶层定义的方法。因此,它可用于嵌套在顶层的类和方法,例如MyClass。

课程中的方法

尽管您的想法如下,但以下内容实际上并未在MyClass上声明:method_one类或实例方法:

class MyClass
  method_one
  def method_two; end
end

相反,Ruby在类的定义期间调用顶级::method_one,但它永远不会成为类方法(例如MyClass::method_one)或实例方法(例如MyClass.new.method_one)。这样做可能有一些用例(例如打印调试信息,测试注入等),但它容易混淆,容易出错,除非你有一个非常强大的用例,否则通常要避免使用。

更好的选择

一般来说,当你在学术课之外看到类似的东西时,程序员可能会做以下其中一件事:

  1. 扩展课程。
  2. 将单例方法添加到类中。
  3. 在课堂中加入模块。
  4. 在课程定义期间设置闭包。
  5. 最后进入了元编程的阴暗区域,此时你可能应该考虑更新类初始化程序,或者传递Proc或lambda对象。 Ruby 你做各种奇怪而奇妙的事情,但这并不意味着你应该

答案 1 :(得分:1)

我觉得你有点误导;输出:

c = MyClass.new
c.method_two

#<MyClass:0x007feda41acf18>
"method 2"

在加载类之前你不会看到方法一,或者你在IRB中输入最后一个结束语句。

我建议调查ruby的初始化方法。

答案 2 :(得分:-3)

不确定这些函数在Ruby中是否具有特定名称,但“Method access in Ruby”应该有助于澄清您遇到的任何问题。