例如在python中,可以为变量赋值方法:
class MyClass
def myMethod(self):
return "Hi"
x = MyClass()
method = x.myMethod
print method() # prints Hi
我知道这应该可以在Ruby中使用,但我不知道语法是什么。
答案 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