Functional Ruby Idioms
Lambdas and Procs
Lambdas and procs store callable behavior in variables.
callable object
A lambda can be passed around and called later with `call`.
Lambdas and Procs
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}"
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
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
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