Я использую ruby 1.9.2p180 (18.02.2011, версия 30909) [ x86_64-linux].
#!/usr/bin/env ruby
def ouch()
raise ArgumentError, "woof"
fred = 3
return( nil )
ensure
if ( defined?( fred ) ) then
printf( "fred is defined (%s)\n", fred.inspect() )
else
printf( "fred is not defined\n" )
end
end # ouch()
ouch()
При запуске вывод вышеупомянутого скрипта ruby довольно неожиданный.
$ ./ouch.rb
fred is defined (nil)
./ouch.rb:4:in `ouch': woof (ArgumentError)
from ./ouch.rb:22:in `<main>'
Таким образом, происходит повышение / исключение, fred не получает значение 3, но он определяется и устанавливается в ноль, тем самым побеждая тест на определено? (). Это очень сбивает с толку. Это ошибка? Очевидно тест за определенными должны следовать тестирование не на ноль.
Если это не ошибка, может ли кто-нибудь объяснить, почему бы и нет?