InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Ruby gibt es mehrere Arten von Variablen, die sich dadurch unterscheiden, wem sie gehören - einem Objekt, einer Klasse oder allen Nachkommen gleichzeitig. Lassen Sie uns das einfach und mit Beispielen klären.
@ - Instanzvariable (instance variable)
Das ist eine gewöhnliche Variable, die einem bestimmten Objekt gehört. Jedes Objekt einer Klasse hat seine eigene Kopie dieser Variable.
class User
def initialize(name)
@name = name
end
def name
@name
end
end
u1 = User.new("Oleh")
u2 = User.new("Ira")
u1.name # => "Oleh"
u2.name # => "Ira"
Jeder Benutzer hat seinen eigenen Namen. @name wird nicht zwischen Objekten geteilt - das sind ihre persönlichen Daten.
@@ - Klassenvariable (class variable)
Eine Variable mit zwei @-Zeichen (@@) ist gemeinsam für alle Instanzen und Unterklassen. Sie lebt innerhalb der gesamten Klassenhierarchie.
class Animal
@@count = 0
def initialize
@@count += 1
end
def self.count
@@count
end
end
class Dog < Animal; end
a1 = Animal.new
d1 = Dog.new
Animal.count # => 2
Dog.count # => 2
Sowohl Animal als auch Dog sehen dieselbe Variable @@count. Wenn die Unterklasse sie ändert, hat das Auswirkungen auf die Elternklasse. Aus diesem Grund gilt @@ als gefährliche und veraltete Praxis - es ist besser, ihre Verwendung zu vermeiden.
Klasseninstanzvariable - sichere Alternative zu @@
Man kann eine Variable auf Klassenebene erstellen, aber so, dass sie nur dieser Klasse gehört und nicht den Nachkommen. Das ist eine gewöhnliche @-Variable, aber auf der Ebene der Klasse selbst deklariert (und nicht innerhalb von initialize).
class User
@count = 0
def self.add_user
@count += 1
end
def self.count
@count
end
end
class Admin < User; end
User.add_user
User.count # => 1
Admin.count # => nil
In diesem Beispiel hat User seine eigene @count, und Admin hat eine separate (anfangs nil, bis sie definiert wird). Das macht den Code sicher und vorhersehbar.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.