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