control_flow/break_from_a_finished_call_no_parens.rb

tests/_examples/control_flow/break_from_a_finished_call_no_parens.rb in the metorex repository.

# `break` returns from the call its block was attached to. Once that call
# has returned there is nothing to break out of, and `break` raises
# LocalJumpError. Written with as few parentheses as Ruby allows.

def capture(&block)
  block
end

def run_it
  yield
end

captured = capture { break :done }
begin
  captured.call
rescue LocalJumpError => error
  p error.message
end

begin
  run_it(&captured)
rescue LocalJumpError => error
  p error.class
end

caught = capture do
  begin
    break :inside
  rescue LocalJumpError => error
    error.class
  end
end
p caught.call

worker = Thread.new do
  begin
    break :break
  rescue LocalJumpError => error
    error.class
  end
end
p worker.value

p(run_it { break :returned })

parent = Class.new do
  def each_value
    yield 1
  end
end
child = Class.new(parent) do
  def each_value
    super { break :from_super }
  end
end
p child.new.each_value

["def stops; break; end", "module Stops; break; end"].each do |source|
  begin
    eval source
  rescue SyntaxError
    puts "refused: #{source}"
  end
end

Output:

"break from proc-closure"
LocalJumpError
LocalJumpError
LocalJumpError
:returned
:from_super
refused: def stops; break; end
refused: module Stops; break; end