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

Was ist der Unterschied zwischen immediate value und reference in Ruby?

Beitrags-Cover: Was ist der Unterschied zwischen immediate value und reference in Ruby?
InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Zuerst müssen wir klären, was immediate value und reference in Ruby sind.
Unmittelbarer Wert (immediate value) in der Programmiersprache ist ein Wert, der direkt in einer Variablen oder einem Objekt gespeichert wird, ohne auf einen anderen Speicherbereich zu verweisen. Das kann eine Zahl, ein Symbol, true, false oder nil sein. Zum Beispiel, wenn Sie einer Variablen eine Zahl zuweisen, ist das ein unmittelbarer Wert.
Referenz (reference) verweist auf den Speicherbereich, in dem ein Objekt gespeichert ist. Objekte, die normalerweise über Referenzen gespeichert werden, umfassen Strings, Arrays, Hashes und Objekte von Klassen. Wenn Sie mit einem Objekt über eine Referenz arbeiten, arbeiten Sie tatsächlich mit dem Speicherbereich, in dem das Objekt selbst gespeichert ist.
In dem Beitrag über die Zuweisung einer Variablen in ruby haben wir das Konzept der Referenz (reference) behandelt. Aber wir haben die unmittelbaren Werte nicht betrachtet.

Unmittelbare Werte in Ruby

Unmittelbarer Wert - das ist ein Wert, der direkt in einer Variablen gespeichert wird, und nicht über eine Referenz auf ein Objekt. Aber es gibt einen Punkt, der mich persönlich ein wenig verwirrt hat. In Ruby haben sogar für unmittelbare Werte Variablen eine object_id, aber sie verweisen auf einen bestimmten Ort im Speicher, an dem der Wert gespeichert ist, und nicht auf ein Objekt, wie es bei Referenzen der Fall ist. Das bedeutet, dass im Fall von unmittelbarem Wert die object_id nicht auf ein Objekt im Speicher verweist, sondern einfach einen bestimmten Wert identifiziert, der direkt in der Variablen gespeichert ist. Ja, in Ruby ist nicht alles ein Objekt.
Zitat von apidock:
object_id() öffentlich

Gibt einen ganzzahligen Identifikator für obj zurück.

Die gleiche Zahl wird bei allen Aufrufen von object_id für ein gegebenes Objekt zurückgegeben, und keine zwei aktiven Objekte teilen sich eine ID.

Hinweis: Einige Objekte von eingebauten Klassen werden zur Optimierung wiederverwendet. Dies ist der Fall für unmittelbare Werte und gefrorene String-Literale.

Unmittelbare Werte werden nicht durch Referenz übergeben, sondern durch Wert: nil, true, false, Fixnums, Symbole und einige Floats.
Diese Werte werden direkt in Variablen gespeichert und können nicht über eine Referenz auf ein Objekt geändert werden. Sie sind die effizienteste Möglichkeit, Daten im Speicher zu speichern, da sie keine Speicherzuweisung für ein Objekt benötigen. Dies wurde zur Optimierung des Speichers getan. Es macht keinen Sinn, für jedes nil neue Objekte zu erstellen. Lassen Sie uns also ein wenig mit IRB spielen.
Ein String ist ein Objekt.
a = 'hehe'
b = 'hehe'

a == b
=> true # Die Strings sind tatsächlich gleich

a.object_id == b.object_id
=> false # Wir haben zwei verschiedene Objekte zur Speicherung des gleichen Inhalts 
Symbole - unmittelbare Werte
a = :test
=> :test
b = :test
=> :test
a.object_id == b.object_id
=> true # Wir haben einen Wert im Speicher und zwei Variablen, die darauf verweisen
Das Gleiche gilt für true, false und nil
a = true
b = true
a.object_id == b.object_id
=> true

a = false
b = false
a.object_id == b.object_id
=> true

a = nil
b = nil
a.object_id == b.object_id
=> true
Ruby reserviert bestimmte object IDs für diese Objekte unmittelbaren Werte, da jede Variable, die einem unmittelbaren Wert zugewiesen wird, auf denselben Speicherort verweist. Überprüfen wir:
true.object_id
=> 20
false.object_id
=> 0
nil.object_id
=> 4

a = true
=> true

b = false
=> false

c = nil
=> nil

a.object_id
=> 20

b.object_id
=> 0

c.object_id
=> 4
Und besser - wir schreiben rspec:
require 'rspec'

describe "Unmittelbare Werte und Referenzen in Ruby" do
  it "demonstriert unmittelbare Werte vs Referenzen" do
    # Unmittelbare Werte
    a = 5
    b = a
    expect(a.object_id).to eq(b.object_id)

    # Referenz
    a = [1, 2, 3]
    b = a
    expect(a.object_id).to eq(b.object_id)
  end

  it "demonstriert object_id für unmittelbare Werte" do
    # True
    a = true
    b = true
    expect(a.object_id).to eq(b.object_id)

    # False
    a = false
    b = false
    expect(a.object_id).to eq(b.object_id)

    # Nil
    a = nil
    b = nil
    expect(a.object_id).to eq(b.object_id)
  end

  it "demonstriert object_id für Symbole" do
    a = :test
    b = :test
    expect(a.object_id).to eq(b.object_id)
  end

  it "demonstriert object_id für gefrorene Literale" do
    a = 'test'.freeze
    b = 'test'.freeze
    expect(a.object_id).to eq(b.object_id)
  end

  it "demonstriert statische object_id für true, false, nil" do
    expect(true.object_id).to eq(20)
    expect(false.object_id).to eq(0)
    expect(nil.object_id).to eq(4)
  end
end
Fertig in 0.01952 Sekunden (Dateien benötigten 0.27884 Sekunden zum Laden)

5 Beispiele, 0 Fehler
Ich hoffe, diese Informationen helfen jemandem, ein wenig über unmittelbare Werte und Referenzen in Ruby zu verstehen.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

Was ist "Scope Creep"?
13. Mai, 07:20 Uhr

Was ist "Scope Creep"?

meme code
meme code@memecode
Was bedeutet "Nativ"?
22. Mai, 07:01 Uhr

Was bedeutet "Nativ"?

meme code
meme code@memecode
Wie funktioniert 'rails console --sandbox'?
23. Mai, 19:39 Uhr

Wie funktioniert 'rails console --sandbox'?

meme code
meme code@memecode
Wofür wird die CVE-Datenbank (Common Vulnerabilities and Exposures) benötigt?
29. Mai, 08:05 Uhr

Wofür wird die CVE-Datenbank (Common Vulnerabilities and Exposures) benötigt?

meme code
meme code@memecode
29. Mai, 09:09 Uhr

Welche Betriebssysteme unterstützen Ruby?

meme code
meme code@memecode
Erstellt Ruby eine neue Kopie des Objekts, wenn eine Variable einer anderen Variable zugewiesen wird?
29. Mai, 09:30 Uhr

Erstellt Ruby eine neue Kopie des Objekts, wenn eine Variable einer anderen Variable zugewiesen wird?

meme code
meme code@memecode
Warum gibt der Ruby-Code nil zurück, nachdem puts ausgeführt wurde?
29. Mai, 20:30 Uhr

Warum gibt der Ruby-Code nil zurück, nachdem puts ausgeführt wurde?

meme code
meme code@memecode
Was ist der Unterschied zwischen nil und false in Ruby?
29. Mai, 20:59 Uhr

Was ist der Unterschied zwischen nil und false in Ruby?

meme code
meme code@memecode
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