2014-10-04 11 views

Odpowiedz

11

== domaga equals, === jest niestandardowy zdefiniowany sposób w gładkie, które wykorzystuje się do porównania kolumna:

def === [P2, R](e: Column[P2])(implicit om: o#arg[B1, P2]#to[Boolean, R]) = 
    om.column(Library.==, n, e.toNode) 

Problem stosowania == obiektów jest następująco (z this question)

Domyślna implementacja klasy equals() podanej przez java.lang.Object porównuje lokalizację pamięci i zwraca wartość true, jeśli dwie zmienne referencyjne wskazują na to samo miejsce w pamięci, tzn. ponownie ten sam obiekt.

Oznacza to, że dwie zmienne muszą być skierowane do tego samego obiektu, aby być równe, na przykład:

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 

W pierwszym przypadku == zwraca false ponieważ res0 i res1 punkt do dwóch różnych obiektów, w drugi przypadek res2 jest równy res0, ponieważ wskazują one na ten sam obiekt.

W gładkich kolumnach są wyodrębnione w obiektach, więc o column1 == column2 nie jest to, czego szukasz, chcesz sprawdzić równość dla wartości przechowywanych w kolumnie, a nie, jeśli wskazują na ten sam obiekt. Slick następnie prawdopodobnie tłumaczy, że === w równości wartości w AST (Library.== jest SqlOperator("="), n jest po lewej stronie kolumny i e po prawej stronie), ale Christopher może wyjaśnić, że lepiej niż ja.

+0

używam '= ~' i '= ! 'w miejsce' === 'i'! == ', jak również' | 'i' & 'zamiast' || 'i' && ', ale to wcale nie jest zgodne z konwencją, po prostu nie lubię hałaśliwych Składnia DSL ... – virtualeyes

+0

Nie widzę odpowiedzi na pytanie o różnicę między metodami: '==' vs '==='. Co oferuje '===', że '==' nie może? Byłbym wdzięczny za wyjaśnienia. –

+0

@JacekLaskowski masz rację. –

12

== jest zdefiniowany na Any w Scala. Firma Slick nie może jej przeciążać dla typów takich, jak dla innych operatorów. Dlatego firma Slick potrzebuje niestandardowego operatora dla równości. Wybraliśmy === podobnie jak kilka innych bibliotek, takich jak skalowalna, skalase, itp.

a == b doprowadzi do prawdziwości lub fałszu. To porównanie po stronie klienta. a === b doprowadzi do obiektu typu Column [Boolean], z instancją Library.Equals (a, b) za nim, który Slick skompiluje do porównania po stronie serwera, używając SQL "a = b" (gdzie aib są zastąpione przez wyrażenia aib).

+0

Nie widzę, jak odpowiada na pytanie o różnicę między metodami - '==' vs '==='. Co oferuje '===', że '==' nie może? Byłbym wdzięczny za wyjaśnienia. –

+0

zaktualizowano odpowiedź – cvogt

+0

Jak to działa, gdy używasz zarówno Slick, jak i Scalatest? –

-1

'==' porównać tylko wartości i doprowadzić Boolean 'True' & „Fałsz

'===' porównanie całkowicie (tznporównanie wartości z jego typów danych) i wynik w kolumnie

przykład

1 == '1' true 1 === '1' Fałsz

Powiązane problemy