У меня была такая же проблема при написании DSL для веб-фреймворка в ruby ... (веб-фреймворк Anorexic будет качаться!) ...
В любом случае, я покопался во внутренностях ruby и нашел простое решение, использующее LocalJumpError, возвращаемое при возврате вызовов Proc ... пока он хорошо работает в тестах, но я не уверен, что это полное доказательство:
def thing(*args, &block)
if block
block_response = nil
begin
block_response = block.call
rescue Exception => e
if e.message == "unexpected return"
block_response = e.exit_value
else
raise e
end
end
puts "value=#{block_response}"
else
puts "no block given"
end
end
оператор if в сегменте спасения может выглядеть примерно так:
if e.is_a? LocalJumpError
но для меня это неизведанная территория, поэтому я буду придерживаться того, что я до сих пор тестировал.