2014-10-04 8 views

risposta

11

== chiede equals, === è un metodo personalizzato definito liscia che viene utilizzato per il confronto colonna:

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

Il problema dell'utilizzo di == per oggetti è questo (da this question):

L'implementazione predefinita della classe equals() fornita da java.lang.Object confronta la posizione della memoria e restituisce true solo se due variabili di riferimento puntano alla stessa posizione di memoria, ovvero essenzialmente a re lo stesso oggetto.

Ciò significa che due variabili deve puntare allo stesso oggetto uguale, esempio:

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 

Nel primo caso == restituisce false perché res0 e res1 scegliere due oggetti differenti, in il secondo caso res2 è uguale a res0 perché punta allo stesso oggetto.

Nelle colonne Slick sono astratti negli oggetti, quindi avere column1 == column2 non è quello che si sta cercando, si desidera controllare l'uguaglianza per il valore di una colonna in attesa e non se puntano allo stesso oggetto. Slick quindi probabilmente traduce che === in un valore di uguaglianza nell'AST (Library.== è un SqlOperator("="), n nella colonna di sinistra e e nella parte destra), ma Christopher può spiegarlo meglio di me.

+0

Io uso '= ~' e '= ! 'al posto di' === 'e'! == ', così come' | 'e' & 'al posto di' || 'e' && ', ma questo non è per niente conforme alla convenzione, semplicemente non mi piace rumoroso Sintassi DSL ... – virtualeyes

+0

Non vedo come risponda alla domanda sulla differenza tra i metodi - '==' vs '==='. Che cosa '=== 'offre che' == 'non potrebbe? Gradirei qualche spiegazione. –

+0

@JacekLaskowski hai un punto. –

12

== è definito su Any in Scala. Slick non può sovraccaricarlo per i tipi Column[...] come è possibile per altri operatori. Ecco perché slick ha bisogno di un operatore personalizzato per l'uguaglianza. Abbiamo scelto === proprio come molte altre librerie, come scalatest, scalaz, ecc.

a == b porterà a vero o falso. È un confronto lato client. a === b porterà ad un oggetto di tipo Column [Boolean], con un'istanza di Library.Equals (a, b) dietro di esso, che Slick compilerà a un confronto lato server usando l'SQL "a = b" (dove a e b sono sostituiti dalle espressioni aeb)).

+0

Non vedo come risponda alla domanda sulla differenza tra i metodi - '==' vs '==='. Che cosa '=== 'offre che' == 'non potrebbe? Gradirei qualche spiegazione. –

+0

ha aggiornato la risposta – cvogt

+0

Come funziona quando si utilizzano sia Slick che Scalatest? –

-1

'==' confrontare il valore unico e il risultato in booleano 'True' & 'False

'===' Confronta completamente (vale a direconfrontare il valore con i suoi tipi di dati) e il risultato nella colonna

esempio

1 == '1' True 1 === '1' False

Problemi correlati