Globale Variablen in Ruby

Hand, die aus einem Computer greift, um Ruby zu greifen

erhui1979 / Getty Images





Globale Variablen sind Variablen auf die unabhängig vom Umfang von überall im Programm aus zugegriffen werden kann. Sie werden dadurch gekennzeichnet, dass sie mit einem $-Zeichen (Dollarzeichen) beginnen. Die Verwendung globaler Variablen wird jedoch oft als „nicht-Ruby“ angesehen, 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 beginnen Sie, sie zu verwenden. Aber wie der Name schon sagt, hat die Zuweisung an globale Variablen von jedem Punkt im Programm globale Auswirkungen. Das folgende Programm demonstriert dies. Die Methode ändert eine globale Variable, und das wirkt sich darauf aus, wie die zweite Methode läuft.



|_+_|

Unpopulär

Warum ist das also „un-Ruby“ und warum sieht man globale Variablen nicht sehr oft? Einfach gesagt, es bricht die Kapselung. Wenn irgendeine Klasse oder Methode den Zustand der globalen Variablen nach Belieben ohne Schnittstellenschicht ändern kann, können sich alle anderen Klassen oder Methoden, die sich auf diese globale Variable stützen, auf unerwartete und unerwünschte Weise verhalten. Außerdem können solche Interaktionen sehr schwierig zu debuggen sein. Was hat diese globale Variable geändert und wann? Sie werden ziemlich viel Code durchsuchen, um herauszufinden, was es getan hat, und das hätte vermieden werden können, indem Sie die Regeln der Kapselung nicht gebrochen hätten.

Aber das heißt nicht, dass es globale Variablen sind noch nie in Rubin verwendet. Es gibt eine Reihe spezieller globaler Variablen mit Einzelzeichennamen (a-la Perl ), die in Ihrem 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, gekennzeichnet durch $0 (das ist eine Null), enthält den Namen des Skripts der obersten Ebene, das ausgeführt wird. Mit anderen Worten, die Skriptdatei, die von der Befehlszeile , nicht die Skriptdatei, die den aktuell ausgeführten Code enthält. Also, wenn script1.rb von der Befehlszeile ausgeführt wurde, würde es halten script1.rb . Wenn dieses Skript erfordert script2.rb , $0 in dieser Skriptdatei wäre ebenfalls script1.rb . Der Name $0 spiegelt die Namenskonvention wider, die beim UNIX-Shell-Scripting für denselben Zweck verwendet wird. $*- Die Kommandozeilenargumente in einem Array, gekennzeichnet durch $* (Dollarzeichen und Sternchen). Zum Beispiel, wenn Sie laufen würden ./script.rb arg1 arg2 , dann wäre $* gleichbedeutend mit % w {arg1 arg2} . Dies ist gleichbedeutend mit dem Besonderen ARGV array und hat einen weniger aussagekräftigen Namen, weshalb es selten verwendet wird. $$- Die Prozess-ID des Interpreters, gekennzeichnet durch $$ (zwei Dollarzeichen). Die Kenntnis der eigenen Prozess-ID ist oft nützlich in Daemon-Programmen (die im Hintergrund laufen, unabhängig von einem Terminal) oder Systemdiensten. Dies wird jedoch etwas komplizierter, wenn Threads beteiligt sind, also seien Sie vorsichtig, es blind zu verwenden. $/ und $- Dies sind die Eingabe- und Ausgabedatensatztrennzeichen. Wenn Sie Objekte mit lesen bekommt und drucke sie mit setzt , verwendet es diese, um zu wissen, 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 aber das Verhalten aller IO-Objekte beeinflussen, werden sie, wenn überhaupt, nur selten verwendet. Sie können sie in kleineren Skripten sehen, wo das Brechen der Kapselungsregeln kein Problem darstellt. $?- Der Beendigungsstatus des zuletzt ausgeführten untergeordneten Prozesses. Von allen hier aufgeführten Variablen ist dies wahrscheinlich die nützlichste. Der Grund dafür ist einfach: Sie können den Exit-Status von untergeordneten Prozessen nicht anhand ihres Rückgabewerts aus dem erhalten System Methode, nur wahr oder falsch. 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 den UNIX-Shells entnommen. $_- Der zuletzt gelesene String bekommt . Diese Variable kann für diejenigen, die von Perl zu Ruby kommen, verwirrend sein. Bei Perl ist die $_-Variable bedeutet etwas ähnliches, aber völlig anderes. Bei 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 enthalten, ist sehr unterschiedlich. Sie sehen diese Variable auch nicht oft (wenn Sie darüber nachdenken, sehen Sie 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 sind oft schlechter Stil (und 'un-Ruby') und nur in sehr kleinen Skripten wirklich nützlich, wo die volle Auswirkung ihrer Verwendung vollständig geschätzt werden kann. Es gibt ein paar spezielle globale Variablen, die verwendet werden können, aber zum größten Teil werden sie nicht verwendet. Sie müssen nicht wirklich viel über globale Variablen wissen, um die meisten Ruby-Programme zu verstehen, aber Sie sollten zumindest wissen, dass es sie gibt.