简体   繁体   中英

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

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM