Nein, die schreibgeschützte Variable $!
ist überall sichtbar und verfügbar und enthält den Wert nil
außer in Rettungsblöcken.
Es ist auch einzigartig für jeden Thread. Es ist die aktuelle Ausnahme (die English
-Bibliothek nennt es $ERROR_INFO
), und es wird auf nil
einmal gerettet zurückgesetzt, es sei denn, es wird erneut ausgelöst, dann ist es wieder die aktuelle Ausnahme.
Von einer Datei, die keine anderen Zeilen enthält, können wir sehen, dass tatsächlich $! ist sichtbar.
puts defined?($!)
puts $!.inspect
irb(main):001:0> defined?($!)
=> "global-variable"
irb(main):002:0> $!
=> nil
irb(main):003:0>
Und in IRB können wir sehen, dass es definiert und sichtbar ist.
Das ist wirklich nicht (oder sollte überhaupt nicht) überraschend, wie die $
bezeichnet, dass es "globale Variable" ist und als solches global sichtbar ist.
Ich konnte nicht finden, wo es nicht sichtbar ist. Sogar in BasicObject ist es sichtbar.
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>
Ich glaube schon, aber ich kann nicht scheinen, es zu bestätigen. –
Ihre 'sure'-Linie und die darauf folgende Linie macht es komplexer als nötig. – sawa
entfernen Sie den Rettungsblock und überprüfen Sie es mit nur einem ... – DGM