How to pass a function as parameter?

I want to pass a reference to function as parameter to another function
and execute the passed function. Somthing like this:

def executer(func)
func(1)
end

def test(x)
p x
end

executer(test)

How to write this correctly in ruby?

Fritz T. wrote:

I want to pass a reference to function as parameter to another function
and execute the passed function. Somthing like this:

def executer(func)
func(1)
end

def test(x)
p x
end

executer(test)

How to write this correctly in ruby?

Are you looking for the #method method?

irb(main):001:0> def a
irb(main):002:1> puts “hello”
irb(main):003:1> end
=> nil
irb(main):004:0> def b(f)
irb(main):005:1> f.call
irb(main):006:1> end
=> nil
irb(main):007:0> m = method(:a)
=> #<Method: Object#a>
irb(main):008:0> b(m)
hello
=> nil
irb(main):009:0>

Marvin

On Wed, Dec 30, 2009 at 12:42 PM, Fritz T. [email protected]
wrote:

executer(test)

How to write this correctly in ruby?

A typical way would be using blocks or procs:

def executer
yield 1
end

executer {|x| puts “I got #{x}”}

If you want something to handle around in a variable:

func = lambda {|x| puts “I got #{x}”}
executer(&func) # => I got 1

Or if in the executer you want to store the block for later use:

def executer(&block)
@save_for_later = block
end

#later
@save_for_later.call(1) #or @save_for_later[1]

Hope this helps,

Jesus.

Thanks for your quick replies.

I see, my scenario is somewhat more complicated, than I wrote in my
initial posting. The point is, that I want to pass an object and a
method.

Something like this:

def executer(obj, method)
f.method(1)
end

class x
def test(x)
p x
end
end

o = x.new
executer(o, test)

Jesús Gabriel y Galán:

end

executer {|x| puts “I got #{x}”}

If you want something to handle around in a variable:

func = lambda {|x| puts “I got #{x}”}
executer(&func) # => I got 1

for &func, what’s the “&” before “func” here?

Thanks.

Correction:

def executer(obj, method)
f.method(1)
end

Should be:
def executer(obj, method)
obj.method(1)
end

Fritz T. wrote:

Thanks for your quick replies.

I see, my scenario is somewhat more complicated, than I wrote in my
initial posting. The point is, that I want to pass an object and a
method.

Something like this:

def executer(obj, method)
f.method(1)
end

class x
def test(x)
p x
end
end

o = x.new
executer(o, test)

Why not just use o.send(:test) ?

Best,

Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Marnen Laibow-Koser wrote:

Why not just use o.send(:test) ?

Thanks, that helps.

On Wed, Dec 30, 2009 at 1:00 PM, Jeff P. [email protected] wrote:

def executer

for &func, what’s the “&” before “func” here?

A method can receive regular parameters and a “special” block
parameter. The & lets you pass a proc as that special block parameter,
instead of a regular one:

irb(main):033:0> executer(func)
ArgumentError: wrong number of arguments (1 for 0)
from (irb):33:in `executer’
from (irb):33
from :0

Jesus.

On Wed, Dec 30, 2009 at 1:08 PM, Fritz T. [email protected] wrote:

Correction:

def executer(obj, method)
f.method(1)
end

Should be:
def executer(obj, method)
obj.method(1)

obj.send(method, 1)

end

executer(O.new, :the_method)

Jesus.

On Wed, Dec 30, 2009 at 6:08 AM, Fritz T. [email protected] wrote:

end
Posted via http://www.ruby-forum.com/.

def executer(obj, method)
obj.send method , 1
end

class X
def test(x)
p x
end
end

o = X.new
executer( o , :test )

Thanks for your help. I got it and it works fine.

Another question:
Is there some ruby reference on the web, something like
http://api.rubyonrails.org/ for example?

On Wed, Dec 30, 2009 at 1:31 PM, Fritz T. [email protected] wrote:

Thanks for your help. I got it and it works fine.

Another question:
Is there some ruby reference on the web, something like
http://api.rubyonrails.org/ for example?

Jesus.

Marnen Laibow-Koser wrote:

Fritz T. wrote:

I see, my scenario is somewhat more complicated, than I wrote in my
initial posting. The point is, that I want to pass an object and a
method.

Something like this:

def executer(obj, method)
f.method(1)
end

class x
def test(x)
p x
end
end

o = x.new
executer(o, test)

Then you can use instance_method(), which is like method() except it
returns an unbound method:

def executer(obj, unbound_method)
unbound_method.bind(obj).call(1234)
end

class X
def test(x)
p x
end
end

o1 = X.new
o2 = X.new
o3 = X.new
method = X.instance_method(:test)

executer(o1, method)
executer(o2, method)
executer(o3, method)

Jesús Gabriel y Galán wrote:

http://ruby-doc.org/

Thanks a lot.