1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
def f1
puts 'foo-begin'
f2 { puts 'break'; break } # break jumps after this statement
puts 'foo-end'
end
def f2 &p
puts 'bar-begin'
f3 &p
puts 'bar-end'
end
def f3
puts 'baz-begin'
yield # unwinds to f1
puts 'baz-end'
end
f1
puts '------------'
# not all call-sites need to pass block thru
# proc.call also works, not only yield
def h1
puts 'foo-begin'
h2 { puts 'break'; break } # break jumps after this statement
puts 'foo-end'
end
def h2 &p
puts 'bar-begin'
$p = p
h3
puts 'bar-end'
end
def h3
puts 'baz-begin'
$p[] # unwinds to h1
puts 'baz-end'
end
h1
puts '------------'
# owner of proc != owner of block
#
def defp &p
$p = p
g2 &p # this is ok
end
def g1
puts 'foo-begin'
#$p = lambda do # the same error result if the following line is replaced by lambda call
defp do
begin
puts 'break' # break from proc-closure error
break
rescue LocalJumpError
puts 'ERROR 1'
end
end
puts 'foo-mid'
g2 &$p # this raises an error #3
puts 'foo-end'
rescue LocalJumpError
puts 'ERROR 4'
end
def g2 &p
puts 'bar-begin'
g3 &p
puts 'bar-end'
rescue LocalJumpError
puts 'ERROR 2'
end
def g3 &p
puts 'baz-begin'
1.times &p # break returns here, we need to decide now whether we can unwind or not
puts 'baz-end'
rescue LocalJumpError => e
puts 'ERROR 3' # rescued here
puts e
puts e.backtrace
end
g1
|