Inhalt

Sichtbarkeitssphären, wie Räume in einem Haus

Als wir über Variablen sprachen, erwähnten wir, dass die häufigste Art Vonvariablen die „lokale Variable“ ist, ohne weiter zu erklären, warum sie sindlokal. Lokal zu was? Wo? Wir sind endlich bereit, das mehr zu erklären.

Da wir jetzt über Methoden gesprochen haben, können wir auch ein anderes wichtiges Diskutierenkonzept: Bereiche.Wikipedia sagt: „In der Programmierung ist der Umfang eines Namens der Teil eines Programms, in dem der Name gültig ist: wo der Name verwendet werden kann, um auf etwas zu beziehenelse.“ (leicht modifiziert, um unserer eigenen Terminologie zu entsprechen)

Namen sind in einem bestimmten Bereich bekannt (oder definiert) und außerhalb dieses Bereichs unbekannt (oder undefiniert).

Sie können sich einen Bereich als eine Kugel, eine Blase oder einen Raum vorstellen (mit Nowindows und geschlossenen Türen): Bestimmte Namen, wie Variablennamen, sind im Raum „bekannt“ und „sichtbar“. Andere Namen, bekannt und sichtbar in einem anderen Raum sindnicht in diesem Raum bekannt, sondern nur in dem anderen Raum.

Jedes Mal, wenn es einen Methodenaufruf gibt und der Ausführungsfluss in den Methodenkörper eintritt, tritt er in einen neuen Bereich oder „Raum“ ein. Dinge, die für den Bereich dieser Methode „lokal“ sind (dh Dinge, die sich „innerhalb“ des Raums befinden), sind nur in diesem Bereich sichtbar. Außerhalb davon sind sie unbekannt.

Undefinierte lokale Variable oder Methode

Dies ist auch eine gute Gelegenheit, über eine Fehlermeldung zu sprechen, die Sie vielleicht am häufigsten sehen. ZB sehen Sie es jedes Mal, wenn Sie einen Tippfehler gemacht und einen Variablen- oder Methodennamen falsch geschrieben haben.

Betrachten Sie diesen Code:

def add_two(number) number + 2endputs add_two(3)puts number

Die Zeile puts add_two(2) gibt 5 aus, aber die Zeile puts number wirddann einen Fehler auslösen.

Dies liegt daran, dass die Variable number, der beim Aufruf der Methode die Nummer 3 zugewiesen wird, eine lokale Variable ist. Es ist lokal für den Bereich der Methode. Es wird erstellt, wenn der Ausführungsfluss in die Methode eintritt.

Außerhalb dieses Bereichs, wenn der Ausführungsfluss von der Methode zurückgekehrt istder Bereich der Methode wurde zerstört und alle lokalen Variablen sind verschwunden. Die Lokale Variable number ist daher nicht bekannt, und Ruby löst einen Fehler aus, derundefined local variable or method 'number' .

Wenn Sie ein wenig über diese Fehlermeldung nachdenken, macht es dann Sinn?

Wir haben stillschweigend die Tatsache übersprungen, dass in Ruby sowohl lokale Variablennamen als auch Methodennamen auf die gleiche Weise geschrieben werden: Sie sind nur einfache Wörter.Zum Beispiel hier:

number = 2puts number

number ist eine lokale Variable und wird in der Zeile puts number verwendet.

Aber hier:

def number 2endputs number

number ist der Name einer Methode. Und es kann genau auf die gleiche Weise verwendet (aufgerufen) werden: puts number

Dies liegt daran, dass Ruby beim Ausführen eines Programms eine Anweisung nach der anderen auswertet. Und wenn es auf ein einfaches Wort wie number dann wird es zuerst prüfen, ob es innerhalb des aktuellen Bereichs eine lokale Variable mit dem gleichen Namen kennt. Wenn ja, wird der Wert verwendet, der dieser Variablen zugeordnet ist. Wenn es keine lokale Variable mit diesem Namen gibt, wird nach einer Methode gesucht. Wenn es auch keine Methode mit diesem Namen gibt, wird die Fehlermeldungundefined local variable or method 'number' .

Die Fehlermeldung ist also ziemlich präzise, klingt aber auch irgendwie verworren. Was ich im Grunde zu sagen versuche, ist:

Sie haben hier das Wort „Nummer“ verwendet, und ich weiß es nicht (in diesem Umfang). Wollten Sie eine lokale Variable verwenden? Oder eine Methode?

Macht das Sinn?

Zurück zum Thema lokale Bereiche. Schauen wir uns ein anderes Beispiel an:

number = 1def add_to(number) number + 2endputs add_to(3)

Was denkst du wird die Ausgabe sein? Wird es 3 oder 5 ? Etwas anderes?

Wenn Sie den Code ausführen, werden Sie sehen, dass es 5 .

Der Grund dafür ist, dass wir die Nummer 1 im äußeren Bereich avariable number zuweisen, aber diese Variable wird dann nie verwendet: Die einzige andere Zeile im äußeren Bereich ist die letzte Zeile puts add_to(3), und diese Zeile verwendet nicht die Variable number.

Wenn der Kontrollfluss stattdessen die Methode add_to Ruby erstellt einen neuen lokalen Bereich und definiert eine neue lokale Variable number, der die Nummer 3 zugewiesen wurde, die an die Methode übergeben wurde. Diese neue Variablenumber ist lokal für den Bereich der Methode und daher eine andere Variable als die in der allerersten Zeile im äußeren Bereich.

Wir fanden Folgendes eine gute Metapher für Bereiche:

Wenn Ruby eine Methode betritt, ist es, als würde sie einen glänzenden neuen Raum in einem Raum betreten. Mit ihr bringt sie die Objekte, die als Argumente übergeben werdenmethodenaufruf. Im obigen Beispiel bringt sie ein Objekt mit der Nummer 3.

Nun, sobald Ruby die Methode betritt, klebt sie Post-it-Notizen auf theobjects, entsprechend der Argumentliste aus der Methodendefinition. In unserem Beispiel ist das der Name number . Von nun an gibt es in diesem Raum eine bekannte lokale Variable, der ein Wert zugewiesen ist: Das Objekt (Nummer) 3 mit der Post-it-Notiz number darauf.

In unserem Beispiel sind der äußere Bereich und der Bereich der Methode add_two, zwei verschiedene Räume, und es gibt zwei verschiedene Post-it-Notizen aufzwei verschiedene Nummern, die zufällig den gleichen Namen haben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.