introspection/block_frame_labels_parens.rb

tests/_examples/introspection/block_frame_labels_parens.rb in the metorex repository.

# A block is a place of its own in a backtrace, named for the scope it was
# written in and for how many blocks deep it sits.
def outer
  1.times do
    puts(caller_locations(0, 1)[0].label)
    1.times do
      puts(caller_locations(0, 1)[0].label)
    end
  end
end

outer

# The scope travels with the block, so one called from somewhere else is
# still named for where it was written.
NAMED = proc { caller_locations(0, 1)[0].label }

module Holder
  def self.run
    NAMED.call
  end
end

puts(Holder.run)

# The base label drops what the block was reached through.
def base
  1.times do
    puts(caller_locations(0, 1)[0].base_label)
  end
end

base

Output:

block in Object#outer
block (2 levels) in Object#outer
block in <main>
base