ruby dreifach gleich
Sagen wir mal, ich habe folgenden code.
result = if a.is_a?(Class) && a <= Exception
a.name
elsif ...
elsif ...
end
Ich umgestaltet werden, diesen code zu
case a
when Exception
a.name
when ...
when ...
end
Verstehe ich dreifach gleich richtig?
- In Ruby die bei einer case-Anweisung ist eine implizite ===.
- Haben Sie Lesen Sie die Dokumentation für
Module#===
? - Ich hatte eine Frage zu diesem Zusammenhang: stackoverflow.com/questions/3757818/...
- Ja, ich weiß, aber er war nicht einmal wirklich mit, dass im ersten Fall, so wurde ich mit Mühe entziffern, was er war, zu Fragen. Es ist klarer jetzt, dass ich hatte einige rest. Danke für die Erklärung, obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können wir noch nicht sagen, ob Sie wirklich bekommen, = = = oder nicht von einem so begrenzten Beispiel. Aber hier ist eine Aufschlüsselung, was wirklich passiert, wenn Sie mit ===, entweder explizit oder implizit als Teil einer case/when-Anweisung wie die in dem Beispiel verwendet..
Den triple-equal(===) hat viele unterschiedliche Implementierungen, die abhängig von der Klasse des linken Teils. Es ist wirklich nur ein infix-notation für die .=== Methode. Was bedeutet, dass Sie die folgenden Anweisungen sind identisch:
Den Unterschied sieht nicht wie viel, aber was es bedeutet ist, dass die linke Seite ist = = = - Methode aufgerufen wird, anstatt einige Magische operator definiert, die sich auf Sprachkenntnisse, das ist, wie==, aber nicht ganz. Statt === wird definiert, in jeder Klasse, der es verwendet, vielleicht in einer geerbten Klasse oder Mixin.
Ist die Allgemeine definition der dreifach gleich ist, dass es Sie gibt true zurück, wenn beide Teile identisch sind oder wenn der Rechte Teil enthalten ist, innerhalb des Bereichs von der linken Seite.
Im Fall der Klasse.===, die operation true zurück, wenn das argument eine Instanz der Klasse (oder Unterklasse). In dem Fall, wo der linken Seite ist ein regulärer Ausdruck, es gibt true zurück, wenn der rechten Seite angegebenen regulären Ausdruck entspricht.
Den, wenn der Fall ist eine STILLSCHWEIGENDE === vergleicht die Fall-variable auf die when-Klausel mit===, so dass die beiden folgenden Anweisungen liefern das gleiche Ergebnis.
Überprüfen Sie die Dokumentation für die Typen, die Sie verwenden auf der linken Seite eines === oder in eine wenn-Anweisung, um sicher zu sein, genau, wie die Dinge funktionieren.
Ich glaube, dass in deinem ersten Beispiel werden Sie überprüfen, ob
a
ist eine Unterklasse vonException
(korrigiert mich wenn ich falsch Liege). Das zweite Beispiel prüft nur, oba
ist eine Instanz vonException
(entsprichta.is_a?(Exception)
).