Ruby Block vs Proc.new vs Lambda vs method(:func) Summarized
There are many ways to pass code around in Ruby, so today I'm going to make a comparison between the 4 different ways. The first section, I will show the syntax of using each of them:
1. Block
2. Proc
3. Lambda
4. method(:func)
On the second section, I will compare the subtle differences they have.
A quick syntax comparison:
* note that the result is at the last section of each code *
1. Block
2. Proc.new
3. Lambda
4. method(:some_method)
Discussion on the subtle differences:
The table below summarizes what each of them can and cannot do, under the table, there are a more in depth explanation on the things shown in the table.
Description | Block | Proc | Lambda | Method | Proof |
Storing into a variable | No | Yes | Yes | Yes | See (a) |
How they work | N/A | Code Replacement | Method Call | Method Call | See (b) |
What class they belong to | Proc | Proc | Proc | Method | See (c) |
Check for correct number of argument | No | No | Yes | Yes | See (d) |
(a) Storing into a variable
Only block is not able to be stored into a variable, the rest is possible, refer to the quick syntax section above.
(b) How they work
Referring to the code right above this sentence, we can see that for
proc_return
, the line return "proc2 I AM HERE!"
is never executed, this is because, Proc.new{return "proc1}.call
works like code replacement, we can imagine proc_return
to be like this:(c) What class they belong to
Run this code: (d) Check for correct number of argument
Block and Proc don't check for the correct number of arguments, they discard extra parameters silently.(http://www.ruby-doc.org/core-1.9.3/Proc.html#method-i-call). For lambda and method(:func), they give error right away. Here's the code
For block:
For proc:
For lambda:
For method(:func):