2013-11-21 6 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

Рубина является объектно-ориентированным языком. Вы можете только обходить и манипулировать объектами, но методы - это не объекты, эрго, вы не можете их пропустить.

You может, однако, спросить рубин, чтобы дать вам прокси-объект для метода с помощью метода 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 
Смежные вопросы