← StartseiteProgrammierung (Програмування)

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

Fragen im Vorstellungsgespräch. Worin unterscheiden sich 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

🔥 Weitere Beiträge

Alle Beiträge
Was sind Immutabilität und Mutabilität?
Programmierung (Програмування)19. Jun '24, 07:48 Uhr

Was sind Immutabilität und Mutabilität?

Was sind Immutabilität und Mutabilität? Beschreibung des Begriffs im Kontext der Programmierung u...

Wie macht man einen leeren Git-Commit?
Programmierung (Програмування)28. Jun '24, 08:33 Uhr

Wie macht man einen leeren Git-Commit?

Wie macht man einen leeren Git-Commit? Wir machen einen leeren Git-Commit. Warum? Wer weiß, jeder...