2015-01-09 6 views
5
begin 
    raise 'foo' 
rescue 
    puts $!.inspect # => #<RuntimeError: foo> 
ensure 
    puts $!.inspect # => nil 
end 
puts $!.inspect # => nil 

Пошел в гору, но не нашел ясного ответа.

Просто хотите подтвердить время жизни (?) $!, оно хранит значение только внутри блока rescue?

+0

Я так считаю, но я не могу подтвердить это. –

+0

Ваша строка 'sure' и строка, следующая за ней, делают ее более сложной, чем необходимо. – sawa

+1

удалите спасательный блок и проверьте его с помощью ... – DGM

ответ

4

$! имеет ошибку в спасательном блоке, или в обеспечении блок, если нет никакого спасения блока:

begin 
    raise 'foo' 
ensure 
    puts $!.inspect # => #<RuntimeError: foo> 
end 

$! имеет значение nil везде.

+0

Thx! хорошо знать. Вероятно, это будет воспринято как ответ, просто подождите еще один день, чтобы быть уверенным. – huocp

0

Нет, переменная только для чтения $! видна и доступна везде, где хранится значение nil, за исключением спасательных блоков.

Он также уникален для каждой нити. Это текущее исключение (библиотека English называет его $ERROR_INFO), и он сбрасывается до nil после спасения, если только он не был повторно поднят, а затем возвращается к текущему исключению.

Из файла, в котором нет других строк, мы можем видеть, что действительно $! видно.

puts defined?($!) 
puts $!.inspect 

irb(main):001:0> defined?($!) 
=> "global-variable" 
irb(main):002:0> $! 
=> nil 
irb(main):003:0> 

И в IRB мы видим, что он определен и видим.

Это действительно не совсем (или, скорее, не должно быть) неожиданно, поскольку $ обозначает, что это «глобальная переменная» и, как таковая, является глобально видимой.

Я не смог найти, где это не видно. Даже в BasicObject это видно.

irb(main):001:0> class BasicObject 
irb(main):002:1> def is_it_visible 
irb(main):003:2>  defined?($!)                         
irb(main):004:2> end                            
irb(main):005:1> end                            
=> :is_it_visible 
irb(main):006:0> BasicObject.allocate.is_it_visible 
=> "global-variable" 
irb(main):007:0> 
+0

Извините, моя формулировка, похоже, вас смутила. Я должен спросить «делает ли $! Только значение внутри блока спасения?». – huocp

+0

Нет, ваш вопрос был очень ясным. Ничто не смущает меня об этом вообще. Он содержит значение nil вне этих блоков, как вы демонстрируете в своем коде. – vgoff

 Смежные вопросы

  • Нет связанных вопросов^_^