Skip to content

Instantly share code, notes, and snippets.

@kivanio
Created September 22, 2010 18:29
Show Gist options
  • Save kivanio/592221 to your computer and use it in GitHub Desktop.
Save kivanio/592221 to your computer and use it in GitHub Desktop.
class ClosureReturnDemo
def return_from_proc
Proc.new do
return true if true
end.call
puts " OUT:"
end
def break_from_proc
Proc.new do
break true if true
end.call
puts " OUT:"
end
def return_from_lambda
lambda do
return true if true
end.call
puts " OUT:"
end
def break_from_lambda
puts " OUT:"
end
def spotcar
yield
puts "SC OUT:"
ensure
puts "SC2OUT:"
end
def return_from_block
spotcar do
return true if true
end
puts " OUT:"
end
def break_from_block
spotcar do
break true if true
end
puts " OUT:"
end
def return_from_lambda_as_block
x = lambda do
return true if true
end
spotcar(&x)
puts " OUT:"
end
def break_from_lambda_as_block
x = lambda do
break true if true
end
spotcar(&x)
puts " OUT:"
end
def return_from_proc_as_block
x = Proc.new do
return true if true
end
spotcar(&x)
puts " OUT:"
end
def break_from_proc_as_block
x = Proc.new do
break true if true
end
spotcar(&x)
puts " OUT:"
end
def execute
%w(return_from_proc break_from_proc
return_from_lambda break_from_lambda
return_from_block break_from_block
return_from_lambda_as_block break_from_lambda_as_block
return_from_proc_as_block break_from_proc_as_block).each do |x|
begin
send x
puts " END: %s\n\n" % [x]
rescue
puts " PROB: %s\n\n" % [$!.message]
end
end
end
end
ClosureReturnDemo.new.execute
__END__
END: return_from_proc
PROB: break from proc-closure
OUT:
END: return_from_lambda
OUT:
END: break_from_lambda
SC2OUT:
END: return_from_block
SC2OUT:
OUT:
END: break_from_block
SC2OUT:
END: return_from_lambda_as_block
SC2OUT:
PROB: break from proc-closure
SC2OUT:
END: return_from_proc_as_block
SC2OUT:
PROB: break from proc-closure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment