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?
==
fordert equals
, ===
ist eine benutzerdefinierte Methode in Slick, die für den Spaltenvergleich verwendet wird:
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.
==
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).
'==' 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