An explicit &block parameter stores the caller's block so the method can call it later.

block argument `&block` turns the passed block into an object that responds to `call`.

Block Argument

factor
block_argument.rb
Replay: real traced execution (multi-file project)
def apply(value, &block)
  block.call(value)
end

factor = 2
base = 4

result = apply(base) do |number|
  number * factor
end

puts "base=#{base}"
puts "factor=#{factor}"
puts "result=#{result}"
def apply(value, &block)
  block.call(value)
end

factor = 3
base = 4

result = apply(base) do |number|
  number * factor
end

puts "base=#{base}"
puts "factor=#{factor}"
puts "result=#{result}"
def apply(value, &block)
  block.call(value)
end

factor = 5
base = 4

result = apply(base) do |number|
  number * factor
end

puts "base=#{base}"
puts "factor=#{factor}"
puts "result=#{result}"
  1. factor ← 2, base ← 4

    5factor→ 2 = 2  #@factor=3, 56base→ 4 = 478result = apply(base4) do |number|9  number * factor10end
  2. def apply(value, &block)

    1def apply(value4, &block⟨Proc A /tmp/execution/⟨tmp B⟩.rb:52⟩)2  block.call(value)83end
  3. result ← 8

    8result→ 8 = apply(base4) do |number4|9  number * factor10end
  4. puts "base=#{base}"

    12puts "base=#{base4}"13puts "factor=#{factor2}"14puts "result=#{result8}"
    outputbase=4
    factor=2
    result=8
  1. factor ← 3, base ← 4

    5factor→ 3 = 36base→ 4 = 478result = apply(base4) do |number|9  number * factor10end
  2. def apply(value, &block)

    1def apply(value4, &block⟨Proc A /tmp/execution/⟨tmp B⟩.rb:52⟩)2  block.call(value)123end
  3. result ← 12

    8result→ 12 = apply(base4) do |number4|9  number * factor10end
  4. puts "base=#{base}"

    12puts "base=#{base4}"13puts "factor=#{factor3}"14puts "result=#{result12}"
    outputbase=4
    factor=3
    result=12
  1. factor ← 5, base ← 4

    5factor→ 5 = 56base→ 4 = 478result = apply(base4) do |number|9  number * factor10end
  2. def apply(value, &block)

    1def apply(value4, &block⟨Proc A /tmp/execution/⟨tmp B⟩.rb:52⟩)2  block.call(value)203end
  3. result ← 20

    8result→ 20 = apply(base4) do |number4|9  number * factor10end
  4. puts "base=#{base}"

    12puts "base=#{base4}"13puts "factor=#{factor5}"14puts "result=#{result20}"
    outputbase=4
    factor=5
    result=20