Warum benötigt Slick die Verwendung von drei Gleichheitszeichen (===) zum Vergleich?

7

Ich habe von SQL nach Slick gelesen und es wird darauf hingewiesen Verwenden Sie === anstelle von == zum Vergleich.

Zum Beispiel

%Vor%

Was ist der Unterschied zwischen == und === , und warum wird letzteres hier verwendet?

    
Kat 04.10.2014, 13:23
quelle

3 Antworten

11

== fordert equals , === ist eine benutzerdefinierte Methode in Slick, die für den Spaltenvergleich verwendet wird:

%Vor%

Das Problem der Verwendung von == für Objekte ist dies (aus diese Frage ):

  

Die Standardimplementierung der Klasse equals (), die von java.lang.Object zur Verfügung gestellt wird, vergleicht den Speicherort und gibt nur true zurück, wenn zwei Referenzvariablen auf dieselbe Speicherstelle zeigen, d. h. im Wesentlichen sind sie dasselbe Objekt.

Dies bedeutet, dass zwei Variablen auf dasselbe Objekt zeigen müssen, um gleich zu sein, Beispiel:

%Vor%

Im ersten Fall gibt == false zurück, weil res0 und res1 auf zwei verschiedene Objekte zeigen, im zweiten Fall res2 ist gleich res0 , weil sie auf das gleiche Objekt zeigen.

In Slick werden Spalten in Objekten abstrahiert. Wenn also column1 == column2 nicht das ist, wonach Sie suchen, möchten Sie die Gleichheit für den Wert einer Spalte überprüfen und nicht, wenn sie auf dasselbe Objekt zeigen. Slick übersetzt dann wahrscheinlich === in eine Wertgleichheit in der AST ( Library.== ist ein SqlOperator("=") , n ist die linke Spalte und e die rechte Seite), aber Christopher kann das besser erklären als ich.

    
Ende Neu 04.10.2014, 13:32
quelle
12

== ist in Any in Scala definiert. Slick kann es nicht für Column[...] -Typen überladen, wie es für andere Operatoren möglich ist. Deshalb braucht Slick einen benutzerdefinierten Operator für Gleichheit. Wir haben === genau wie einige andere Bibliotheken gewählt, wie zB scalatest, scalaz, etc.

a == b führt zu wahr oder falsch. Es ist ein clientseitiger Vergleich. a === b führt zu einem Objekt vom Typ Column [Boolean], mit einer Instanz von Library.Equals (a, b) dahinter, die von Slick zu einem serverseitigen Vergleich mit dem SQL "a = b" kompiliert wird (wobei a und b durch die Ausdrücke a und b ersetzt werden).

    
cvogt 04.10.2014 16:38
quelle
-1
  

'==' nur Wert vergleichen und Boolesch 'True' & amp; 'Falsch

     

'===' Vergleiche vollständig (d. h. vergleiche den Wert mit seinen Datentypen) und ergibt die Spalte

Beispiel

1 == '1' Wahr 1 === '1' Falsch

    
Mahendra Jadaun 18.09.2017 13:09
quelle

Tags und Links