将方法作为参数传递

时间:2013-11-21 22:08:07

标签: ruby

是否有办法在不使用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 )

2 个答案:

答案 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