Нет, переменная только для чтения $!
видна и доступна везде, где хранится значение 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>
Я так считаю, но я не могу подтвердить это. –
Ваша строка 'sure' и строка, следующая за ней, делают ее более сложной, чем необходимо. – sawa
удалите спасательный блок и проверьте его с помощью ... – DGM