虽然@JohnNaegle 的回答是正确的,但我发现使用#method 是一种更优雅的方法,它返回一个Method 对象。方法对象有一个.call(*args) 方法,尽管您可以传递参数。所以,在你的例子中,它看起来像:
def one(param)
puts param
end
def two(param, callback)
callback.call(param)
end
two('hi', method(:one))
变化在于您通过调用Object.method(与method 相同)而不是字符串来传递对Method 实例的引用。
如果您想传递符号而不是 Method,您可以使用以下版本的 #two:
def two_2(param, callback)
method(callback.to_sym).call(param)
end
two_2('hi', :one)
# Or you could also pass a string or anything that #responds_to?(:to_sym)
two_2('hi', 'one')
我建议的进一步改进是,two 可以接受多个参数传递给回调,首先列出回调,然后使用*params 接收尽可能多的参数。这是一个示例(使用上面的#one 的定义):
def one_with_many_params(*params)
puts params.join
end
# Improved version of two
def two_3(callback, *params)
callback.call(params)
end
# Improved version of two_2
def two_4(callback, *params)
method(callback.to_sym).call(params)
end
two_3(method(:one), 'hi') #=> "hi"
two_3(method(:one_with_many_params), "Hi", " my ", "name", " is ", "Foo!")
#=> "Hi my name is Foo!"
two_4('one', 'Hello!') #=> "Hello!"
two_4(:one_with_many_params, "Hi", " my ", "name", " is ", "Bar!")
#=> "Hi my name is Bar!"