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.
Gefällt dir?Reagieren
🧵
Dieser Beitrag hat noch keine Ergänzungen vom Autor.