procs/lambda_and_proc.rb

tests/_examples/procs/lambda_and_proc.rb in the metorex repository.

strict = lambda { |a, b| a + b }
loose = proc { |a, b| [a, b] }
arrow = -> (a) { a * 2 }

def capture(&block)
  block
end

ordinary = capture { 1 }

puts strict.lambda?
puts loose.lambda?
puts arrow.lambda?
puts ordinary.lambda?

puts strict.call(1, 2)
puts loose.call(1).inspect
puts loose.call(1, 2, 3).inspect

begin
  strict.call(1)
rescue ArgumentError => error
  puts error.class
end

def lambda_return
  result = lambda { return :from_lambda }.call
  [result, :method_finished]
end
puts lambda_return().inspect

def proc_return
  capture { return :from_proc }.call
  :method_finished
end
puts proc_return().inspect

already = lambda { 5 }
reused = lambda(&already)
puts reused.lambda?

begin
  lambda(&proc { 6 })
rescue ArgumentError => error
  puts "#{error.class}: #{error.message}"
end

begin
  lambda
rescue ArgumentError => error
  puts "#{error.class}: #{error.message}"
end

class Redefined
  def lambda(&block)
    block
  end

  def uses_own_lambda
    lambda { 7 }.lambda?
  end
end
puts Redefined.new.uses_own_lambda

Output:

true
false
true
false
3
[1, nil]
[1, 2]
ArgumentError
[:from_lambda, :method_finished]
:from_proc
true
ArgumentError: the lambda method requires a literal block
ArgumentError: tried to create Proc object without a block
false