Lambdas and procs store callable behavior in variables.

callable object A lambda can be passed around and called later with `call`.

Lambdas and Procs

factor
lambdas_procs.rb
Replay: real traced execution (multi-file project)
factor = 3
scale = ->(number) { number * factor }
numbers = [1, 2, 3]

scaled = numbers.map { |number| scale.call(number) }
scaled_text = scaled.join("/")

puts "factor=#{factor}"
puts "scaled=#{scaled_text}"
puts "last=#{scaled.last}"
factor = 2
scale = ->(number) { number * factor }
numbers = [1, 2, 3]

scaled = numbers.map { |number| scale.call(number) }
scaled_text = scaled.join("/")

puts "factor=#{factor}"
puts "scaled=#{scaled_text}"
puts "last=#{scaled.last}"
factor = 4
scale = ->(number) { number * factor }
numbers = [1, 2, 3]

scaled = numbers.map { |number| scale.call(number) }
scaled_text = scaled.join("/")

puts "factor=#{factor}"
puts "scaled=#{scaled_text}"
puts "last=#{scaled.last}"
  1. factor ← 3, scale ← ⟨Proc A /tmp/execution/⟨tmp B⟩.rb:32 (lambda)⟩

    1factor→ 3 = 3  #@factor=2, 42scale→ ⟨Proc A /tmp/execution/⟨tmp B⟩.rb:32 (lambda)⟩ = ->(number) { number * factor }3numbers→ [1, 2, 3] = [1, 2, 3]45scaled→ [3, 6, 9] = numbers[1, 2, 3].map { |number| scale.call(number) }6scaled_text→ 3/6/9 = scaled.join("/")3/6/978puts "factor=#{factor3}"9puts "scaled=#{scaled_text3/6/9}"10puts "last=#{scaled.last9}"
    outputfactor=3
    scaled=3/6/9
    last=9
  1. factor ← 2, scale ← ⟨Proc A /tmp/execution/⟨tmp B⟩.rb:32 (lambda)⟩

    1factor→ 2 = 22scale→ ⟨Proc A /tmp/execution/⟨tmp B⟩.rb:32 (lambda)⟩ = ->(number) { number * factor }3numbers→ [1, 2, 3] = [1, 2, 3]45scaled→ [2, 4, 6] = numbers[1, 2, 3].map { |number| scale.call(number) }6scaled_text→ 2/4/6 = scaled.join("/")2/4/678puts "factor=#{factor2}"9puts "scaled=#{scaled_text2/4/6}"10puts "last=#{scaled.last6}"
    outputfactor=2
    scaled=2/4/6
    last=6
  1. factor ← 4, scale ← ⟨Proc A /tmp/execution/⟨tmp B⟩.rb:32 (lambda)⟩

    1factor→ 4 = 42scale→ ⟨Proc A /tmp/execution/⟨tmp B⟩.rb:32 (lambda)⟩ = ->(number) { number * factor }3numbers→ [1, 2, 3] = [1, 2, 3]45scaled→ [4, 8, 12] = numbers[1, 2, 3].map { |number| scale.call(number) }6scaled_text→ 4/8/12 = scaled.join("/")4/8/1278puts "factor=#{factor4}"9puts "scaled=#{scaled_text4/8/12}"10puts "last=#{scaled.last12}"
    outputfactor=4
    scaled=4/8/12
    last=12