3

Is there are way to pass a method as a parameter without using a Proc object or block? The answers I've seen to similar questions rely on creating a Proc object.

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 Answers 2

4
def bob(jeff) puts "hi #{jeff}" end def mary(meth, params) meth.call(params) end mary(method(:bob), 'yo') => hi yo 
Sign up to request clarification or add additional context in comments.

Comments

2

Ruby is an object-oriented language. You can only pass around and manipulate objects, but methods aren't objects, ergo, you cannot pass them around.

You can, however, ask Ruby to give you a proxy object for a method via the Object#method method, which will return a Method object (which duck-types 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 

An alternative would be to pass the name of the method as a 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 

So, in short: no, you cannot pass the method, but you can pass either the name of the method or a proxy object for the method.

However, the idiomatic way would be to use a block:

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 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.