Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

[Ruby] Was unterscheidet Variablen, die mit @, @@ und $ beginnen?

Beitrags-Cover: [Ruby] Was unterscheidet Variablen, die mit @, @@ und $ beginnen?
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.

Warum ist eine leere Zeichenkette (string) in Ruby nicht false?
31. Mai, 14:39 Uhr

Warum ist eine leere Zeichenkette (string) in Ruby nicht false?

meme code
meme code@memecode
Sichtbarkeit des lokalen Variablenbereichs in Ruby
03. Jun, 16:46 Uhr

Sichtbarkeit des lokalen Variablenbereichs in Ruby

meme code
meme code@memecode
Was ist der Unterschied zwischen int und bigint in Ruby? Minimale und maximale Werte.
13. Jun, 06:37 Uhr

Was ist der Unterschied zwischen int und bigint in Ruby? Minimale und maximale Werte.

meme code
meme code@memecode
Was bedeutet der Fehler 'is out of range' in Ruby on Rails? Bereichsfehler - Ganzzahl mit einer Begrenzung von 4 Bytes
13. Jun, 07:18 Uhr

Was bedeutet der Fehler 'is out of range' in Ruby on Rails? Bereichsfehler - Ganzzahl mit einer Begrenzung von 4 Bytes

meme code
meme code@memecode
Was sind Immutabilität und Mutabilität?
19. Jun, 07:48 Uhr

Was sind Immutabilität und Mutabilität?

meme code
meme code@memecode
[Ruby] Was ergibt die Addition von 10,5 und 10?
23. Jun, 13:23 Uhr

[Ruby] Was ergibt die Addition von 10,5 und 10?

meme code
meme code@memecode
Was ist eine Funktion in der Programmierung?
24. Jun, 18:15 Uhr

Was ist eine Funktion in der Programmierung?

meme code
meme code@memecode
[Fix] extconf.rb ist bei der Installation der Ruby-Bibliothek Gosu fehlgeschlagen
27. Jun, 16:38 Uhr

[Fix] extconf.rb ist bei der Installation der Ruby-Bibliothek Gosu fehlgeschlagen

meme code
meme code@memecode
Wie macht man einen leeren Git-Commit?
28. Jun, 08:33 Uhr

Wie macht man einen leeren Git-Commit?

meme code
meme code@memecode
Ruby-Bibliothek Gosu zur Erstellung von 2D-Spielen
29. Jun, 08:48 Uhr

Ruby-Bibliothek Gosu zur Erstellung von 2D-Spielen

meme code
meme code@memecode
Gosu Ruby Tutorial - пройдемось по офіційній документації
03. Jul, 11:50 Uhr

Gosu Ruby Tutorial - пройдемось по офіційній документації

meme code
meme code@memecode
Wir schreiben das Demospiel Drones vs Zombies (Gosu / Ruby)
12. Jul, 12:17 Uhr

Wir schreiben das Demospiel Drones vs Zombies (Gosu / Ruby)

meme code
meme code@memecode