Ruby 'wenn' Schlüsselwort verwendet nicht == in case-Anweisung. Was benutzt es?

8

x == User gibt true zurück, aber case x Anweisung führt den mit User verknüpften Block nicht aus. Was ist hier los?

%Vor%     
maček 21.09.2010, 06:28
quelle

2 Antworten

21

Fallvergleiche verwenden === anstatt == . Bei vielen Objekten ist das Verhalten von === und == gleich, siehe Numeric und String :

%Vor%

Aber für andere Arten von Objekten kann === viele Dinge bedeuten, ganz abhängig vom Empfänger.

Bei Klassen überprüft === , ob ein Objekt eine Instanz dieser Klasse ist:

%Vor%

Für Range wird überprüft, ob ein Objekt in diesen Bereich fällt:

%Vor%

Bei Procs ruft === tatsächlich Proc auf:

%Vor%

Für andere Objekte überprüfen Sie ihre Definition von === , um ihr Verhalten aufzudecken. Es ist nicht immer offensichtlich, aber sie machen normalerweise einen Sinn ..

Hier ist ein Beispiel, das alles zusammenfasst:

%Vor%

Siehe diesen Link für weitere Informationen: Ссылка

    
horseyguy 21.09.2010, 07:01
quelle
2

In der case-Anweisung wird der Vergleich mit === operator durchgeführt.

Ihr Code wird folgendermaßen übersetzt:

%Vor%

Unterschiedliche Klasse definieren === auf andere Weise:

Die Klasse Class definiert === , so dass sie testet, ob der rechte Operand ( x ) eine Instanz der vom linken Operanden benannten Klasse ist ( User ). Es ist also keine Überraschung, dass User === x als false ausgewertet wird. Stattdessen ist User === u (u = Benutzer.neu) true .

%Vor%     
pierrotlefou 21.09.2010 06:34
quelle

Tags und Links