我是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文档中搜索有关此语法/语言功能的更多信息,但我不知道要搜索的关键字。
这叫做什么?
答案 0 :(得分:2)
此代码不符合您的想法。不要做这样的事情。
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
)。这样做可能有一些用例(例如打印调试信息,测试注入等),但它容易混淆,容易出错,除非你有一个非常强大的用例,否则通常要避免使用。
一般来说,当你在学术课之外看到类似的东西时,程序员可能会做以下其中一件事:
最后进入了元编程的阴暗区域,此时你可能应该考虑更新类初始化程序,或者传递Proc或lambda对象。 Ruby 让你做各种奇怪而奇妙的事情,但这并不意味着你应该。
答案 1 :(得分:1)
我觉得你有点误导;输出:
c = MyClass.new
c.method_two
是
#<MyClass:0x007feda41acf18>
"method 2"
在加载类之前你不会看到方法一,或者你在IRB中输入最后一个结束语句。
我建议调查ruby的初始化方法。
答案 2 :(得分:-3)
不确定这些函数在Ruby中是否具有特定名称,但“Method access in Ruby”应该有助于澄清您遇到的任何问题。