Ruby has the class Proc which encapsulates a "block of code". There are 2 "flavors" of Procs:
- Those with "block semantics", called blocksor confusingly sometimes alsoprocs
- Those with "method semantics", called lambdas
lambdas 
They behave like Ruby method definitions:
- They are strict about their arguments.
- 
returnmeans "exit thelambda"
How to define a lambda
 
- 
With the lambdakeywordtest = lambda do |arg| puts arg end
- 
With the lambda literal ->(since Ruby 1.9.1)test = ->(arg) do puts arg end
blocks 
They behave like do-blocks or simply "segments of code":
- They try to be smart about their arguments:
- When the block accepts multiple arguments and receives an array, it will splat the array
- When the block receives less arguments than required, it will set the missing ones to nil
- When the block receives too many arguments, it will discard some
 
- 
returnmeans "exit the surrounding method"- for only "exiting the block" usebreak(takes an argument!)
- there also are nextandcontinue
 
- for only "exiting the 
How to define a block
 
- 
With the prockeyword:test = proc do |arg| puts arg end
- 
With Proc.new:test = Proc.new do |arg| puts arg end
- 
By passing a block to a method: def capture_block(&block) block end test = capture_block do |arg| puts arg end
How to call a block
Calling a block or a lambda works the same way. There are multiple possibilities
- 
call(we prefer this)test.call('hello world')
- 
Square brackets (could easily be mistaken for a hash) test['hello world']
- 
.()(weird, isn't it?)test.('hello world')
Posted by Judith Roth to makandra dev (2015-11-24 13:40)