Vorheriges | Inhaltsverzeichnis | Nächstes |
Verstehen von Ruby Variablen | Ruby Zahlenklassen und Konvertierungen |
Nachdem wir nun die Grundlagen der Variablen in Ruby behandelt haben, besteht die nächste Aufgabe darin, den Variablenumfang von Ruby zu erklären.
Was ist Variablen-Scope?
Scope definiert, wo in einem Programm eine Variable zugänglich ist. In Ruby gibt es vier Arten von Variablenbereichen: lokal, global, Instanz und Klasse. Darüber hinaus gibt es in Ruby einen Konstantentyp. Jeder Variablentyp wird durch die Verwendung eines speziellen Zeichens am Anfang des Variablennamens deklariert, wie in der folgenden Tabelle dargestellt.
Name beginnt mit | Variablenumfang |
---|---|
$ |
Eine globale Variable |
@ |
Eine Instanzvariable |
oder _ |
Eine lokale Variable |
|
Eine Konstante |
@@ |
Eine Klassenvariable |
Außerdem, Ruby hat zwei Pseudovariablen, denen keine Werte zugewiesen werden können. Dies sind nil, das nicht initialisierten Variablen zugewiesen wird, und self, das sich auf das gerade ausgeführte Objekt bezieht. Im weiteren Verlauf dieses Kapitels werden wir uns jeden dieser Variablenbereiche der Reihe nach ansehen.
Detecting the Scope of a Ruby Variable
Natürlich kann man den Bereich einer Variablen anhand des Namens erkennen. Manchmal muss man den Bereich jedoch programmatisch herausfinden. Eine nützliche Technik, um den Bereich einer Variablen herauszufinden, ist die Verwendung der defined?-Methode. defined? gibt den Bereich der Variablen zurück, auf die verwiesen wird, oder nil, wenn die Variable im aktuellen Kontext nicht definiert ist:
x = 10=> 10defined? x=> "local-variable"$x = 10=> 10defined? $x=> "global-variable"
Ruby Lokale Variablen
Lokale Variablen sind lokal in dem Codekonstrukt, in dem sie deklariert sind. Zum Beispiel kann auf eine lokale Variable, die in einer Methode oder in einer Schleife deklariert wurde, nicht außerhalb dieser Schleife oder Methode zugegriffen werden. Lokale Variablennamen müssen entweder mit einem Unterstrich oder einem Kleinbuchstaben beginnen. Zum Beispiel:
loopcounter = 10_LoopCounter = 20
Ruby Globale Variablen
Globale Variablen in Ruby sind von überall im Ruby-Programm zugänglich, unabhängig davon, wo sie deklariert sind. Globalen Variablennamen wird ein Dollarzeichen ($) vorangestellt. Zum Beispiel:
$welcome = "Welcome to Ruby Essentials"
Von der Verwendung globaler Variablen wird dringend abgeraten. Das Problem mit globalen Variablen ist, dass sie nicht nur überall im Code eines Programms sichtbar sind, sondern auch von überall in der Anwendung geändert werden können. Das kann die Fehlersuche erschweren.
Es ist jedoch nützlich zu wissen, dass Ihnen als Ruby-Entwickler eine Reihe vordefinierter globaler Variablen zur Verfügung stehen, um Informationen über die Ruby-Umgebung zu erhalten. Eine kurze Zusammenfassung jeder dieser Variablen ist in der folgenden Tabelle enthalten.
Variablenname | Variablenwert |
---|---|
|
Der Ort des letzten Fehlers |
$_ |
Der String, der zuletzt von gets |
$. |
Die vom Interpreter zuletzt gelesene Zeilennummer |
$& |
Die von regexp zuletzt gefundene Zeichenkette |
$~ |
Die letzte regexp-Übereinstimmung, als Array von Unterausdrücken |
$ n |
Der n-te Unterausdruck in der letzten Übereinstimmung (wie $~ ) |
$= |
Die Groß-/KleinschreibungGroß-/Kleinschreibung |
$/ |
Das Eingabe-Satz-Trennzeichen |
$\ |
Das Ausgabe-Satz-Trennzeichen Trennzeichen |
|
Der Name der Ruby-Skriptdatei, die gerade ausgeführt wird |
$* |
Die Befehlszeilenargumente, mit denen das Skript aufgerufen wurde |
$$ |
Die Prozess-ID des Ruby-Interpreters |
$? |
Der Exit-Status des zuletzt ausgeführten Child-Prozesses |
Zum Beispiel können wir die gets-Methode ausführen, um Eingaben von der Tastatur zu erhalten, und dann die Variable $_ referenzieren, um den eingegebenen Wert abzurufen:
irb(main):005:0> getshello=> "hello\n"irb(main):006:0> $_=> "hello\n"
Alternativ könnten wir die Prozess-ID des Ruby-Interpreters ermitteln:
irb(main):007:0> $$=> 17403
Ruby-Klassenvariablen
Eine Klassenvariable ist eine Variable, die von allen Instanzen einer Klasse gemeinsam genutzt wird. Das bedeutet, dass nur ein Variablenwert für alle Objekte existiert, die von dieser Klasse instanziiert werden. Das bedeutet, dass, wenn eine Objektinstanz den Wert der Variable ändert, sich dieser neue Wert auch für alle anderen Objektinstanzen ändert.
Eine andere Möglichkeit, sich Klassenvariablen vorzustellen, ist, sie als globale Variablen im Kontext einer einzelnen Klasse zu betrachten.
Klassenvariablen werden deklariert, indem dem Variablennamen zwei @-Zeichen (@@) vorangestellt werden. Klassenvariablen müssen zur Erstellungszeit initialisiert werden. Zum Beispiel:
@@total = 0
Ruby Instanzvariablen
Instanzvariablen sind ähnlich wie Klassenvariablen, außer dass ihre Werte lokal für bestimmte Instanzen eines Objekts sind. Wenn zum Beispiel eine Klasse eine Instanzvariable namens @total enthält und eine Instanz des Objekts den aktuellen Wert von @total ändert, ist die Änderung nur für das Objekt lokal, das die Änderung vorgenommen hat. Andere Objekte derselben Klasse haben ihre eigenen lokalen Kopien der Variable, die unabhängig von Änderungen in anderen Objekten sind.
Instanzvariablen werden in Ruby deklariert, indem dem Variablennamen ein einzelnes @-Zeichen vorangestellt wird:
@total = 10
Ruby Constant Scope
Ruby-Konstanten sind Werte, die, wenn sie einmal einen Wert zugewiesen bekommen haben, nicht geändert werden sollten. Ich sage „sollten“, weil Ruby sich von den meisten Programmiersprachen dadurch unterscheidet, dass es erlaubt, den Wert einer Konstante zu ändern, nachdem sie deklariert wurde, obwohl der Interpreter mit einer Warnmeldung dagegen protestieren wird.
Konstanten, die innerhalb einer Klasse oder eines Moduls deklariert werden, sind überall im Kontext dieser Klasse oder dieses Moduls verfügbar. Konstanten, die außerhalb einer Klasse oder eines Moduls deklariert werden, erhalten einen globalen Gültigkeitsbereich.
Vorheriges | Inhaltsverzeichnis | Nächstes |
Verstehen von Ruby-Variablen | Ruby-Zahlenklassen und Konvertierungen |