2013-11-21 191 views
3

有没有办法将方法作为参数传递而不使用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) 

回答

4
def bob(jeff) 
    puts "hi #{jeff}" 
end 

def mary(meth, params) 
    meth.call(params) 
end 

mary(method(:bob), 'yo') 
=> hi yo 
2

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 

因此,简而言之:不,你ç annot通过该方法,但你可以通过传递该方法的名称或该方法的代理对象。

然而,惯用的方法是使用块:

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