jsbueno
jsbueno

Reputation: 110238

How to pass more one code block to a function in Ruby?

I don't know any Ruby and am reading some documentationon it now. A doubt I have just after reading about using code blocks and the "yield" keyword is whether it is possible to pass more than one code block to a function, and use both at will from within the called function.

Upvotes: 6

Views: 753

Answers (4)

Dafydd Rees
Dafydd Rees

Reputation: 6983

You can use the call method rather than yield to handle two separate blocks passed in.

Here's how:

def mood(state, happy, sad )
  if (state== :happy)
    happy.call
  else
    sad.call
  end
end

mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})
mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'})

You can pass args with for example:

happy.call('very much')

arguments work just like you'd expect in blocks:

Proc.new {|amount| puts "yay #{amount} !"}

Upvotes: 1

LaC
LaC

Reputation: 12824

You can create Proc objects and pass around as many as you like.

I recommend reading this page to understand the subtleties of all different block- and closure-like constructs Ruby has.

Upvotes: 1

Simone Carletti
Simone Carletti

Reputation: 176372

You can pass only one block at once but blocks are actually Proc instances and you can pass as many instances you wish as parameters.

def mymethod(proc1, proc2, &block)
  proc1.call
  yield if block_given?
  proc2.call
end

mymethod(Proc.new {}, Proc.new {}) do
  # ...
end

However, it rarely makes sense.

Upvotes: 9

abyx
abyx

Reputation: 72768

Syntactically, using the yield statement only supports one code block that's passed to the function.

Of course, you can pass a function multiple other functions or "code block objects" (Proc objects), and use them, but not by simply using yield.

Upvotes: 1

Related Questions