Globale Variablen in Ruby

Globale Variablen sind Variablen, auf die von überall im Programm zugegriffen werden kann, unabhängig vom Gültigkeitsbereich. Sie beginnen mit einem Dollarzeichen ($). Die Verwendung globaler Variablen wird jedoch häufig als "un-Ruby" betrachtet, und Sie werden sie selten sehen.

Globale Variablen definieren

Globale Variablen werden wie jede andere Variable definiert und verwendet. Um sie zu definieren, weisen Sie ihnen einfach einen Wert zu und verwenden Sie sie. Wie der Name schon sagt, hat die Zuweisung zu globalen Variablen von einem beliebigen Punkt im Programm globale Auswirkungen. Das folgende Programm zeigt dies. Die Methode ändert eine globale Variable und dies wirkt sich darauf aus, wie die zweite Methode läuft.

 $ speed = 10 def beschleunigen $ speed = 100 end def pass_speed_trap wenn $ speed> 65 # Geben Sie dem Programm ein Speeding Ticket End End beschleunigen pass_speed_trap 

Unpopulär

Warum ist das also "un-Ruby" und warum sehen Sie globale Variablen nicht sehr oft? Einfach gesagt, es bricht die Kapselung. Wenn eine Klasse oder Methode den Status der globalen Variablen nach Belieben ohne Schnittstellenebene ändern kann, verhalten sich andere Klassen oder Methoden, die auf dieser globalen Variablen basieren, möglicherweise unerwartet und unerwünscht. Darüber hinaus kann es sehr schwierig sein, solche Interaktionen zu debuggen. Was hat diese globale Variable geändert und wann? Sie werden eine Menge Code durchsehen, um herauszufinden, was es getan hat, und das hätte vermieden werden können, wenn Sie die Kapselungsregeln nicht verletzt hätten.

Das heißt aber nicht, dass globale Variablen es sind noch nie in Ruby verwendet. Es gibt eine Reihe spezieller globaler Variablen mit Einzelzeichennamen (a-la-Perl), die im gesamten Programm verwendet werden können. Sie stellen den Status des Programms selbst dar und ändern beispielsweise die Datensatz- und Feldtrennzeichen für alle bekommt Methoden.

Globale Variablen

  • $ 0 - Diese Variable, die mit $ 0 (das ist eine Null) bezeichnet ist, enthält den Namen des Skripts der obersten Ebene, das ausgeführt wird. Mit anderen Worten, die Skriptdatei, die über die Befehlszeile ausgeführt wurde, nicht die Skriptdatei, die den aktuell ausgeführten Code enthält. Also, wenn script1.rb Wurde von der Kommandozeile ausgeführt, würde es halten script1.rb. Wenn dieses Skript erfordert script2.rb, $ 0 in dieser Skriptdatei wäre auch script1.rb. Der Name $ 0 spiegelt die Namenskonvention wider, die in UNIX-Shell-Skripten für denselben Zweck verwendet wird.
  • $ * - Die Befehlszeilenargumente in einem Array, das mit $ * (Dollarzeichen und Sternchen) gekennzeichnet ist. Zum Beispiel, wenn Sie rennen würden ./script.rb arg1 arg2, dann wäre $ * gleichbedeutend mit % w arg1 arg2. Dies entspricht dem speziellen ARGV-Array und hat einen weniger aussagekräftigen Namen. Daher wird es nur selten verwendet.
  • $$ - Die Prozess-ID des Interpreters, angegeben mit $$ (zwei Dollarzeichen). Die Kenntnis der eigenen Prozess-ID ist häufig in Daemon-Programmen (die im Hintergrund ausgeführt werden und nicht an ein Terminal angeschlossen sind) oder in Systemdiensten hilfreich. Dies wird jedoch etwas komplizierter, wenn Threads beteiligt sind. Seien Sie also vorsichtig, wenn Sie es blind verwenden.
  • $ / und $ \ - Dies sind die Eingabe- und Ausgabesatztrennzeichen. Wenn Sie Objekte lesen mit bekommt und drucken Sie sie mit setzt, Diese werden verwendet, um zu ermitteln, wann ein vollständiger "Datensatz" gelesen wurde oder was zwischen mehreren Datensätzen gedruckt werden soll. Standardmäßig sollte dies das Zeilenumbruchzeichen sein. Da diese jedoch das Verhalten aller E / A-Objekte beeinflussen, werden sie, wenn überhaupt, nur selten verwendet. Möglicherweise werden sie in kleineren Skripten angezeigt, bei denen ein Verstoß gegen die Kapselungsregeln kein Problem darstellt.
  • $? - Der Beendigungsstatus des zuletzt ausgeführten untergeordneten Prozesses. Von allen hier aufgelisteten Variablen ist dies wahrscheinlich die nützlichste. Der Grund dafür ist einfach: Sie können den Beendigungsstatus von untergeordneten Prozessen nicht anhand ihres Rückgabewerts von der Systemmethode abrufen, sondern nur anhand von true oder false. Wenn Sie den tatsächlichen Rückgabewert des untergeordneten Prozesses kennen müssen, müssen Sie diese spezielle globale Variable verwenden. Auch hier wird der Name dieser Variablen aus den UNIX-Shells übernommen.
  • $ _ - Die letzte Zeichenfolge, die von gelesen wurde bekommt. Diese Variable kann für diejenigen, die von Perl zu Ruby kommen, zu Verwirrung führen. In Perl bedeutet die Variable $ _ etwas Ähnliches, aber völlig anderes. In Perl, $ _ Enthält den Wert der letzten Anweisung und in Ruby den von der vorherigen zurückgegebenen String bekommt Aufruf. Ihre Verwendung ist ähnlich, aber was sie wirklich halten, ist sehr unterschiedlich. Sie sehen diese Variable auch nicht oft (denken Sie daran, Sie sehen selten eine dieser Variablen), aber Sie können sie in sehr kurzen Ruby-Programmen sehen, die Text verarbeiten.

Kurz gesagt, Sie werden selten globale Variablen sehen. Sie haben oft eine schlechte Form (und sind "un-Ruby") und sind nur in sehr kleinen Skripten wirklich nützlich, in denen die volle Bedeutung ihrer Verwendung voll gewürdigt werden kann. Es gibt einige spezielle globale Variablen, die verwendet werden können, die jedoch größtenteils nicht verwendet werden. Sie müssen nicht viel über globale Variablen wissen, um die meisten Ruby-Programme zu verstehen, aber Sie sollten zumindest wissen, dass sie vorhanden sind.