Gültigkeitsbereich (Scope) von
Variablen
Variablen haben je nach Art einen unterschiedlichen
Geltungsbereich (oder eine unterschiedliche „Reichweite“)
innerhalb der Ruby- und damit auch innerhalb einer
Ruby-on-Rails-Applikation. Man muss bei der Programmierung diese
Reichweite immer im Hinterkopf behalten, weil sonst merkwürdige Effekte
auftreten.
Lokale Variablen (aaa oder _aaa)
Lokale Variablen fangen entweder mit einem kleinen Buchstaben
oder mit einem Unterstrich (
_
) an. Ihr
Gültigkeitsbereich beschränkt sich auf die aktuelle Umgebung (z. B.
auf die aktuelle Methode). Beispiel:
sw@debian:~/sandbox$ irb
1.9.3p194 :001:0> aaa = 10 # Lokale Variable aaa
=> 10
1.9.3p194 :002:0> _bbb = 20 # Lokale Variable _bbb
=> 20
1.9.3p194 :003:0> puts aaa
10
=> nil
1.9.3p194 :004:0> puts _bbb
20
=> nil
1.9.3p194 :005:0> def test # Definition der Methode test
1.9.3p194 :006:1> aaa = 1000 # Lokale Variable aaa
1.9.3p194 :007:1> _bbb = 2000 # Lokale Variable _bbb
1.9.3p194 :008:1> puts aaa # Ausgabe von aaa
1.9.3p194 :009:1> puts _bbb # Ausgabe von _bbb
1.9.3p194 :010:1> end # Ende der Methode test
=> nil
1.9.3p194 :011:0> puts aaa
10
=> nil
1.9.3p194 :012:0> puts _bbb
20
=> nil
1.9.3p194 :013:0> test # Aufruf der Methode test
1000 # siehe irb-Zeile 8
2000 # siehe irb-Ziele 9
=> nil
1.9.3p194 :014:0> puts aaa
10
=> nil
1.9.3p194 :015:0> puts _bbb
20
=> nil
1.9.3p194 :016:0> exit
Eine globale Variable fängt mit einem
$
-Zeichen an und ist im gesamten Programm
erreichbar. Beispiel:
sw@debian:~/sandbox$ irb
1.9.3p194 :001:0> $aaa = 10
=> 10
1.9.3p194 :002:0> puts $aaa
10
=> nil
1.9.3p194 :003:0> def test # Definition der Methode test
1.9.3p194 :004:1> $aaa = 20
1.9.3p194 :005:1> end
=> nil
1.9.3p194 :006:0> puts $aaa # Ausgabe von $aaa
10
=> nil
1.9.3p194 :007:0> test # Aufruf der Methode test
=> 20
1.9.3p194 :008:0> puts $aaa # Ausgabe von $aaa
20
=> nil
1.9.3p194 :009:0> $aaa.class
=> Fixnum
1.9.3p194 :010:0> exit
Globale Variablen werden recht selten benutzt.
Instanz-Variablen (
„Attribute“, daher das
@
) gelten nur innerhalb einer Klasse, dort aber
überall – sozusagen eine Mini-Version von globalen Variablen. Im
Gegensatz zu globalen Variablen findet man Instanz-Variablen in einer
Rails-Applikation an jeder Ecke. Wir gehen die Sache über ein
Beispielprogramm namens
farbe.rb
an:
class Wand
def initialize
@farbe = 'weiß'
end
def farbe
@farbe
end
def streich_alles_rot
@farbe = 'rot'
end
def streich_alles_gelb
@farbe = 'gelb'
end
def streich_alles_rosa
farbe = 'rosa' # Achtung: Dies ist eine lokale Variable.
end
end
meine_wand = Wand.new
puts meine_wand.farbe
meine_wand.streich_alles_rot
puts meine_wand.farbe
meine_wand.streich_alles_rosa
puts meine_wand.farbe
Wenn Sie dieses Programm starten, erscheint folgende
Ausgabe:
sw@debian:~/sandbox$ ruby farbe.rb
weiß
rot
rot
sw@debian:~/sandbox$
In der Methode
initialize
setzen wir die
Instanz-Variable
@farbe
auf den Wert
„weiß“. Die Methoden
streich_alles_rot
und
streich_alles_gelb
verändern diese
Instanz-Variable. Die Methode
streich_alles_rosa
hingegen setzt nur eine
lokale Variable mit dem Namen
farbe
(es fehlt das
@
-Zeichen).
Mit der Methode farbe
können wir uns
außerhalb der Instanz den Wert von @farbe
ausgeben
lassen.