Reputation: 110238
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
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
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
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
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