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

==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte

Beitrags-Cover: ==, gleich?, eql?, === in Ruby: was sie überprüfen und wann man sie verwenden sollte
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Ruby gibt es mehrere Möglichkeiten zum Vergleichen. Sie sehen auf den ersten Blick ähnlich aus, funktionieren aber ganz anders.

== (Überprüfung der Gleichheit von Werten)

  • Überprüft, ob die Objekte denselben Inhalt haben.
  • Wird häufig in Klassen (String, Array, Hash) überschrieben, um Werte und nicht Identitäten zu vergleichen.
a = "hello"
b = "hello"

a == b        # => true
a.equal?(b)   # => false
== fragt: "Haben diese Objekte denselben Inhalt?"

equal? (Überprüfung der Identität von Objekten)

  • Überprüft, ob es dasselbe Objekt im Speicher ist.
  • Wird in Klassen nicht überschrieben, vergleicht immer die Objekt-IDs.
a = "hello"
b = "hello"
c = a

a.equal?(b)  # => false
a.equal?(c)  # => true
Hier muss man verstehen, was ein Objekt in Ruby ist.

eql? (strenge Gleichheitsprüfung für Hashes und Zahlen)

  • Überprüft Wert und Typ.
  • Wird hauptsächlich in Hashes für Schlüssel verwendet.
1 == 1.0     # => true
1.eql?(1.0)  # => false, da verschiedene Klassen (Integer vs Float)
eql? ist strenger als ==.

=== (case-match Operator)

  • Wird hauptsächlich in der case-Konstruktion verwendet (darüber sprechen wir gleich).
  • Verhält sich unterschiedlich für verschiedene Klassen:
    • Bei Klassen (String, Integer) - überprüft, ob das Objekt zur Klasse gehört (is_a?).
    • Bei regulären Ausdrücken - überprüft, ob der String dem Muster entspricht.
    • Bei Range - ob das Objekt im Bereich liegt.
case 5
when 1..10
  "Im Bereich"   # => "Im Bereich"
end

String === "hello"  # => true
/ell/ === "hello"   # => true
Betrachten wir das Beispiel mit case etwas genauer. Wie funktioniert case … when in Ruby?
Syntax:
case Objekt
when Muster1
  Code1
when Muster2
  Code2
else
  Standard_Code
end
Was passiert im Hintergrund
Ruby macht ungefähr Folgendes:
if Muster1 === Objekt
  Code1
elsif Muster2 === Objekt
  Code2
else
  Standard_Code
end
Das heißt, when verwendet automatisch === für den Vergleich mit dem case-Wert. 
Hier sind Beispiele für verschiedene Typen
Bereich (Range)
case 5
when 1..10
  "Im Bereich"
else
  "Außerhalb des Bereichs"
end
# => "Im Bereich"
Es funktioniert so, als ob Ruby (dies ist Pseudocode):
(1..10) === 5  # => true
Es ist jedoch wichtig zu beachten, dass die normale Verwendung von === mit Zahlen oder anderen Typen nicht unbedingt gleich funktioniert:
10 === (1..20)   # => false
10 == (1..20)    # => false
(1..20) == 10    # => false
Hier überprüft Range#===, ob die Zahl im Bereich liegt.
Klasse
case "hello"
when String
  "Das ist ein String"
when Integer
  "Das ist eine Zahl"
end
# => "Das ist ein String"
Ruby führt aus:
String === "hello"   # => true
Integer === "hello"  # => false
Für Klassen ist === eine Abkürzung für obj.is_a?(Klasse).
c) Regulärer Ausdruck
case "hello"
when /ell/
  "Übereinstimmung mit dem Muster"
else
  "Keine Übereinstimmung"
end
# => "Übereinstimmung mit dem Muster"
Im Hintergrund:
/ell/ === "hello"   # => true
Für Regexp überprüft ===, ob der String dem Muster entspricht.
Wir sind ein wenig vom Thema === abgekommen und haben uns mit case beschäftigt (weil dort === im Hintergrund verwendet wird). Ein so einfacher Operator, aber er macht verschiedene Dinge.
Um es sich leichter zu merken:
  • case x; when y - das ist nicht x == y, sondern y === x.
  • === funktioniert unterschiedlich je nach Typ y:
    • Class -> is_a?
    • Range -> include?
    • Regexp -> =~ (Übereinstimmung des Strings)
Das ermöglicht es, Bedingungen sehr flexibel zu schreiben.

Dieser Beitrag hat noch keine Ergänzungen vom Autor.

Wie self, protected und private funktioniert (Ruby)
28. Okt, 13:52 Uhr

Wie self, protected und private funktioniert (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist
28. Okt, 14:10 Uhr

Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28. Okt, 14:42 Uhr

Wie funktioniert &:to_s in Ruby und was ist Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was sind Proc und Lambda in Ruby?
28. Okt, 15:57 Uhr

Was sind Proc und Lambda in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?
29. Okt, 17:54 Uhr

Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt
29. Okt, 18:29 Uhr

Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend in Ruby: wie sie funktionieren und wo der Unterschied liegt
29. Okt, 21:20 Uhr

Include, Extend, Prepend in Ruby: wie sie funktionieren und wo der Unterschied liegt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
module_function in Ruby: wenn die Methoden eines Moduls sowohl als Modulmethoden als auch als Funktionen verfügbar sind
29. Okt, 21:53 Uhr

module_function in Ruby: wenn die Methoden eines Moduls sowohl als Modulmethoden als auch als Funktionen verfügbar sind

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was ist Memoization in Ruby?
30. Okt, 10:17 Uhr

Was ist Memoization in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
is_a?, kind_of?, instance_of? — wie prüft Ruby den Typ eines Objekts?
30. Okt, 19:55 Uhr

is_a?, kind_of?, instance_of? — wie prüft Ruby den Typ eines Objekts?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
&& vs and — der Unterschied in Ruby, der Ihren Code brechen kann
30. Okt, 20:23 Uhr

&& vs and — der Unterschied in Ruby, der Ihren Code brechen kann

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Variablen in Ruby: @, @@ und Klasseninstanzvariablen
30. Okt, 20:54 Uhr

Variablen in Ruby: @, @@ und Klasseninstanzvariablen

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska