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.
                +1 
                A: 
                
                
              
            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.
                  abyx
                   2009-11-25 14:08:22
                
              
                +10 
                A: 
                
                
              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.
                  Simone Carletti
                   2009-11-25 14:11:29
                
              Blocks aren't exactly procs.  They have common usecases and syntaxes, but they have enough implementation differences to cause confusing behavior.  It's a bit pedantic, but the scoping difference has bit me before.
                  fengb
                   2009-11-25 14:25:49
                @fengb I just made a test. http://gist.github.com/242746 Do you have some more documentation about the difference between Proc and block? Ruby is telling me a block is a Proc.
                  Simone Carletti
                   2009-11-25 14:31:51
                
                  
                  fengb
                   2009-11-25 15:00:11
                
                Thanks. This is a long article, I'm going to crunch it in small pieces. :)
                  Simone Carletti
                   2009-11-25 15:56:14
                
                
                A: 
                
                
              
            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} !"}
                  cartoonfox
                   2009-11-25 14:18:27