

Understanding Ruby Blocks, Procs and Lambdas - robertsosinski
http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/
Learn the subtle differences between Blocks, Procs and Lambdas with Ruby and how to use each effectively in your methods.
======
aaronblohowiak
Don't forget the changes in 1.9 <http://railspikes.com/2008/9/8/lambda-in-
ruby-1-9>

And the much cooler Fibers, which you can think of as a reentrant block, kind
of.

------
charlesju
Great post, I had the longest time trying to figure out what blocks were. They
aren't used that much in PHP and Java and stuff so it was a totally new
concept for me.

I still don't understand Procs and Lambdas but my head is too full today, will
finish reading your post tomorrow.

As a side note, please enable comments, I'd love to leave you some good
feedback on your actual site.

------
davidmathers
"But I have yet to find a good, definitive guide out there."

Really? I thought this was the definitive guide:
<http://innig.net/software/ruby/closures-in-ruby.rb>

It seems like a good guide to me.

------
tlrobinson
What's the reason for blocks not being real objects (i.e. Procs) themselves
(like in JavaScript or Lisp)?

Is it simply to allow for the magic syntax of passing a block to a method so
it can be called with yield?

~~~
raganwald
Most of the problem is the `return` keyword. In a proc or lambda, it returns
from the proc or lambda. In a block, it returns from whatever is enclosing the
block, like a proc, lambda, or method.

If you had a block that was an actual object, it could outlive its enclosing
environment. Calling return within it would reincarnate its enclosing
environment. Calling return twice would fork time.

In other words, if a block was an object, the return keyword would create a
_continuation_. This is a very expensive, very heavyweight feature in Ruby,
and the whole point of blocks is to provide something cheap and lightweight.

Note that a proc or lambda has no such problem, since a return within it
returns to whatever invokes the #call method of the proc or lambda.

Imagine how much simpler things would be if Matz had worked this all out and
decided that the return keyword was more trouble than it was worth?

~~~
aaronblohowiak
I respectfully disagree that the return keyword is more trouble than it is
worth.

"return false if simple_question?" ... rest of the body

is a very useful thing to do. granted, you might say it is "programming by
GOTO", but it lowers the indentation level, and so keeps me happy.

To the GP: we can also .to_proc on blocks.

~~~
raganwald
Sorry I didn't see this when you posted it. The problem is not `return :foo if
bar()`, it's something like `pizzles.each { |p| return :foo if p.bar() }`. In
Ruby, that returns from the surrounding method, not from the block where it's
defined.

You can decide for yourself if this behaviour of return more trouble than it's
worth. I didn't say it was, I said that this definition is what forces a block
to be something different from a proc, which makes the language more
complicated.

