是否有办法在不使用Proc
对象或块的情况下将方法作为参数传递?我看到类似问题的答案依赖于创建Proc
对象。
def call_a_method_via_a_parameter( &some_method )
# ?? call some_method and pass it a parameter ??
end
def my_method( param )
puts param
end
call_a_method_via_a_parameter( &:my_method )
答案 0 :(得分:4)
def bob(jeff)
puts "hi #{jeff}"
end
def mary(meth, params)
meth.call(params)
end
mary(method(:bob), 'yo')
=> hi yo
答案 1 :(得分:2)
Ruby是一种面向对象的语言。你只能传递并操纵对象,但方法不是对象,因此你无法传递它们。
但是,要求Ruby通过Object#method
方法为您提供方法的代理对象,该方法将返回Method
对象(鸭子类型) Proc
):
def call_a_method_via_a_parameter(some_method)
some_method.('Hi')
end
def my_method(param)
puts param
end
call_a_method_via_a_parameter(method(:my_method))
# Hi
另一种方法是将方法的名称作为Symbol
传递:
def call_a_method_via_a_parameter(some_method)
public_send(:some_method, 'Hi')
end
def my_method(param)
puts param
end
call_a_method_via_a_parameter(:my_method)
# Hi
因此,简而言之:不,你不能传递方法,但你可以传递方法的名称或方法的代理对象。
然而,惯用方式是使用块:
def call_a_method_via_a_parameter
yield 'Hi'
end
def my_method(param)
puts param
end
call_a_method_via_a_parameter(&method(:my_method))
# Hi