InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Ruby haben Variablen, die mit @, @@ und $ beginnen, unterschiedliche Sichtbarkeits- und Verwendungsstufen (Scope). Lassen Sie uns Beispiele betrachten und die Unterschiede so einfach wie möglich erklären.
@ oder @instance_variable
Variablen, die mit @ beginnen, sind Instanzvariablen. Sie gehören zu einem bestimmten Objekt (Instanz der Klasse) und sind nur innerhalb dieses Objekts zugänglich. Jede Instanz der Klasse hat ihre eigenen Instanzvariablen. Lassen Sie uns das überprüfen:
class Example
def initialize(value)
@instance_variable = value
end
def show
@instance_variable
end
end
obj1 = Example.new(10)
obj2 = Example.new(20)
puts obj1.show # Gibt 10 aus
puts obj2.show # Gibt 20 aus
Die Initialisierungsmethode des Objekts nimmt einen Wert entgegen und setzt ihn in die Instanzvariable (wenn wir die Methode show auf dem Objekt obj1 aufrufen, wird zuerst die Initialisierung und dann die Methode selbst ausgeführt). Die Methode show gibt den Wert der Instanzvariable zurück.
Das bedeutet, dass eine Variable, die mit dem Zeichen @ definiert wird, es ermöglicht, Werte zwischen den Methoden der Klasse im Kontext des Objekts zu teilen. Jedes neue Objekt, wie z.B. obj2, hat seinen eigenen Wert in der Variablen @instance_variable.
@@ oder @@class_variable
Variablen, die mit @@ beginnen, sind Klassenvariablen. Sie sind für alle Instanzen der Klasse gemeinsam. Wenn eine der Klassenvariablen in einer Instanz der Klasse geändert wird, ist diese Änderung in allen anderen Instanzen dieser Klasse sichtbar.
Ein einfaches Beispiel:
class Example
@@class_variable = 0
def self.increment
@@class_variable += 1
end
def self.show
@@class_variable
end
end
Example.increment
Example.increment
puts Example.show # Gibt 2 aus
Das bedeutet, dass Klassenvariablen alle Objekte dieser Klasse beeinflussen. Manchmal kann das ziemlich gefährlich sein, und man muss sehr vorsichtig sein, um nicht allen Objekten zu schaden.
$ oder $global_variable
Variablen, die mit $ beginnen, sind globale Variablen. Sie sind von jedem Teil des Programms aus zugänglich, unabhängig vom Sichtbarkeitsbereich. Die Verwendung globaler Variablen kann es schwierig machen, den Zustand des Programms zu verfolgen, daher sollten sie, wenn möglich, vermieden werden.
Ein Beispiel:
$global_variable = 10 def show_global $global_variable end puts show_global # Gibt 10 aus
Das Beispiel ist nicht sehr anschaulich, aber technisch gesehen kann diese globale Variable überall im Programm geändert und verwendet werden.
Zusammenfassend
- @instance_variable: Instanzvariable, einzigartig für jedes Objekt.
- @@class_variable: Klassenvariable, gemeinsam für alle Instanzen der Klasse.
- $global_variable: Globale Variable, zugänglich von jedem Teil des Programms.
Nun lernen wir, Tests zu schreiben - man kann immer irgendwelche Aussagen mit Hilfe von Tests überprüfen.
test.rb
require 'rspec'
class Example
@@class_variable = 0
$global_variable = 0
def initialize(value)
@instance_variable = value
end
def increment_class_variable
@@class_variable += 1
end
def increment_global_variable
$global_variable += 1
end
def instance_variable
@instance_variable
end
def self.class_variable
@@class_variable
end
def self.global_variable
$global_variable
end
end
RSpec.describe 'Verschiedene Arten von Variablen' do
before do
@example1 = Example.new(1)
@example2 = Example.new(2)
end
context 'Instanzvariablen' do
it 'einzigartig für jedes Objekt' do
expect(@example1.instance_variable).to eq(1)
expect(@example2.instance_variable).to eq(2)
end
end
context 'Klassenvariablen' do
it 'gemeinsam für alle Instanzen der Klasse' do
@example1.increment_class_variable
@example2.increment_class_variable
expect(Example.class_variable).to eq(2)
end
end
context 'Globale Variablen' do
it 'von jedem Teil des Programms zugänglich' do
@example1.increment_global_variable
@example2.increment_global_variable
expect(Example.global_variable).to eq(2)
end
end
end
rspec test.rb ...Fertig in 0.01932 Sekunden (Dateien benötigten 0.28601 Sekunden zum Laden) 3 Beispiele, 0 Fehler
Dieser Beitrag hat noch keine Ergänzungen vom Autor.