2014-10-04 36 views

回答

11

==呼叫爲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第一種情況下,因爲res0res1指向兩個不同的對象,在第二種情況res2等於res0,因爲它們指向相同的對象。

在Slick列被抽象爲對象,因此column1 == column2不是您正在查找的內容,您希望檢查列的值是否相等,而不是指向同一個對象。 Slick然後可能翻譯在AST中的值相等的===Library.==SqlOperator("="),n是左側欄和e右側),但克里斯托弗可以解釋,比我好。

+0

我使用'=〜'和'= !'代替'==='和'!==',以及代替'||'和'&&'的'|'和'&,但這並不符合慣例,只是不喜歡嘈雜DSL語法... – virtualeyes 2014-10-04 19:31:16

+0

我不明白它如何回答關於方法之間區別的問題 - '=='和'==='。 '==='提供的== =='不能做什麼?我會很感激一些解釋。 – 2014-10-05 13:49:40

+0

@JacekLaskowski你有一個觀點。 – 2014-10-05 14:14:28

12

==定義在斯卡拉的Any。對於Column[...]類型,Slick不能超載,類似於其他操作員可以使用的類型。這就是爲什麼光滑需要一個自定義運算符的平等。我們選擇了===就像其他幾個庫,如scalatest,scalaz等。

a == b會導致錯誤。這是一個客戶端比較。 a === b將導致一個類型爲Column [Boolean]的對象,其後面有一個Library.Equals(a,b)實例,Slick將使用SQL「a = b」編譯爲服務器端比較。 (其中a和b被表達式a和b代替)。

+0

我不明白它是如何回答有關方法之間差異的問題 - 「==」和「===」。 '==='提供的== =='不能做什麼?我會很感激一些解釋。 – 2014-10-05 13:49:10

+0

更新了答案 – cvogt 2014-10-05 16:57:22

+0

當你使用Slick和Scalatest時它是如何工作的? – 2017-09-05 08:07:41

-1

'==' 僅比較值,並導致在布爾 '真' &「假

'===' 比較完全地(即比較其數據類型的值),並導致柱

例如

1 == '1' 真 1 === '1' 假

相關問題