什么相当于Ruby中的“方法引用”

时间:2010-04-20 19:00:04

标签: ruby

例如在python中,可以为变量赋值方法:

class MyClass 
    def myMethod(self):
        return "Hi"


 x = MyClass()
 method = x.myMethod

 print method() # prints Hi

我知道这应该可以在Ruby中使用,但我不知道语法是什么。

2 个答案:

答案 0 :(得分:28)

您需要使用方法名称作为参数的method来获取方法。这将返回一个Method类型的实例,可以使用call()调用该实例。

class MyClass
  def myMethod
    "Hi"
  end
end

x = MyClass.new
m = x.method(:myMethod)
# => #<Method: MyClass#myMethod>

puts m.call
# You can also do m[] instead of m.call()

请注意,任何参数都需要添加到call方法。


然而,在许多实际情况中,没有必要将方法本身保存到Ruby中的变量中;如果您只想动态调用方法(即向对象发送消息)并且无需保存方法,则还可以使用send(或__send__方法冲突)。

x = MyClass.new
puts x.send :myMethod # also possible with a string: m.send "myMethod"
# "Hi"

任何参数都应遵循方法名称:

puts x.send(:myMethod, arg1, arg2)

像这样使用它可能更像Ruby,因为Method类的概念不像Python那样突出。在Python中,在执行a_string.split()之类的操作时,您始终可以考虑两步机制;首先,您使用a_string.split抓取该方法然后调用它(隐式使用()或使用__call__()显式调用)。因此,削减这两步机制是相当自然的。

Ruby更多地基于消息传递,并且实际上在Ruby中获得了一个方法类,你将不得不做更多的工作,因为在某种程度上,必须在那时为你构造方法对象。因此,除非你真的需要Ruby中的一些Methods对象,否则你应该坚持使用传递抽象的消息并简单地使用send

答案 1 :(得分:4)

我认为你正在寻找Proc或lambda块

x = Proc.new { return "Hello World" }
puts x.call

x = lambda { return "Hello World" }
puts x.call

我会阅读这篇简短的帖子 - 这些方法的行为方式存在细微但显着的差异 http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby

相关问题