我正在通過coming from SQL to Slick進行閱讀,並聲明使用===
代替==
進行比較。爲什麼Slick需要使用三個等號(===)進行比較?
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
是什麼==
和===
之間的區別,爲什麼這裏使用後者?
我正在通過coming from SQL to Slick進行閱讀,並聲明使用===
代替==
進行比較。爲什麼Slick需要使用三個等號(===)進行比較?
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
是什麼==
和===
之間的區別,爲什麼這裏使用後者?
==
呼叫爲equals
,===
是在光滑的一個自定義的方法,該方法被用於列比較:
def === [P2, R](e: Column[P2])(implicit om: o#arg[B1, P2]#to[Boolean, R]) =
om.column(Library.==, n, e.toNode)
使用==
爲對象的問題是這樣的(來自this question):
java.lang.Object提供的equals()類的默認實現比較內存位置,並且只有當兩個引用變量指向相同的內存位置時才返回true,即基本上它們是a重新相同的對象。
這意味着兩個變量必須指向相同的對象是相等的,例如:
scala> class A
defined class A
scala> new A
res0: A = [email protected]
scala> new A
res1: A = [email protected]
scala> res0 == res1
res2: Boolean = false
scala> val res2 = res0
res2: A = [email protected]
scala> res2 == res0
res4: Boolean = true
在==
返回false第一種情況下,因爲res0
和res1
指向兩個不同的對象,在第二種情況res2
等於res0
,因爲它們指向相同的對象。
在Slick列被抽象爲對象,因此column1 == column2
不是您正在查找的內容,您希望檢查列的值是否相等,而不是指向同一個對象。 Slick然後可能翻譯在AST中的值相等的===
(Library.==
是SqlOperator("=")
,n
是左側欄和e
右側),但克里斯托弗可以解釋,比我好。
==
定義在斯卡拉的Any
。對於Column[...]
類型,Slick不能超載,類似於其他操作員可以使用的類型。這就是爲什麼光滑需要一個自定義運算符的平等。我們選擇了===
就像其他幾個庫,如scalatest,scalaz等。
a == b會導致錯誤。這是一個客戶端比較。 a === b將導致一個類型爲Column [Boolean]的對象,其後面有一個Library.Equals(a,b)實例,Slick將使用SQL「a = b」編譯爲服務器端比較。 (其中a和b被表達式a和b代替)。
我不明白它是如何回答有關方法之間差異的問題 - 「==」和「===」。 '==='提供的== =='不能做什麼?我會很感激一些解釋。 – 2014-10-05 13:49:10
更新了答案 – cvogt 2014-10-05 16:57:22
當你使用Slick和Scalatest時它是如何工作的? – 2017-09-05 08:07:41
'==' 僅比較值,並導致在布爾 '真' &「假
'===' 比較完全地(即比較其數據類型的值),並導致柱
例如
1 == '1' 真 1 === '1' 假
我使用'=〜'和'= !'代替'==='和'!==',以及代替'||'和'&&'的'|'和'&,但這並不符合慣例,只是不喜歡嘈雜DSL語法... – virtualeyes 2014-10-04 19:31:16
我不明白它如何回答關於方法之間區別的問題 - '=='和'==='。 '==='提供的== =='不能做什麼?我會很感激一些解釋。 – 2014-10-05 13:49:40
@JacekLaskowski你有一個觀點。 – 2014-10-05 14:14:28