==
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.
fonte
2014-10-04 13:32:51
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
Non vedo come risponda alla domanda sulla differenza tra i metodi - '==' vs '==='. Che cosa '=== 'offre che' == 'non potrebbe? Gradirei qualche spiegazione. –
@JacekLaskowski hai un punto. –