Allan
Allan

Reputation: 4710

Ruby: How to pass the result of an block as an argument

Can I some how pass the result of an evaluated block as an argument to a function?

This illustrates what I want to do by using a helper function (do_yield):

#!/usr/bin/env ruby

def do_yield
    yield
end

def foo a
   #'a' must be an array 
   puts "A: [#{a.join(", ")}]"
end

foo (do_yield{
    a = []
    a << 1
})

Can I do this without creating my own helper function? Preferably by using facilities in the language, if the language does not offer a way to do it, then is there an existing function I can use instead of my own do_yield

Upvotes: 0

Views: 65

Answers (2)

glenatron
glenatron

Reputation: 11352

The piece of terminology you probably want to search for here is lambda - a lambda being an anonymous function that can be passed around as a parameter.

So to do what you are describing with a Lambda you might do this:

my_lambda = lambda do 
  a = [] 
  a << 1
end

def foo a
   #'a' must be an array 
   puts "A: [#{a.join(", ")}]"
end

foo my_lambda.call

Of course you can have parameterised lambdas and if foo was expecting a lambda you could have it call #{a.call.join(", ")}] ( your actual code has double-quotes everywhere so not sure it would work ) so that the evaluation only happened when it was passed.

This is an interesting and powerful part of Ruby so it is worth learning about.

Upvotes: 0

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230286

So, you want to pass a result of executing some code into some other code? You just need to convert your "block" to an expression (by making it a proper method, for example)

def bar
  a = []
  a << 1
end

foo bar

If your code is really this simple (create array and append element), you can use the code grouping constructs (which combine several statements/expressions into one expression)

foo((a = []; a << 1))

or

foo(begin
  a = []
  a << 1
end)

Personally, I'd definitely go with the method. Much simpler to read.

Upvotes: 2

Related Questions