我正在阅读从SQL到Slick的全部内容,并且指出要使用===
而不是==
进行比较。
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
==
和之间有什么区别===
,为什么在这里使用后者?
==
调用equals
,===
是slick中一个自定义定义的方法,用于列比较:
def === [P2, R](e: Column[P2])(implicit om: o#arg[B1, P2]#to[Boolean, R]) =
om.column(Library.==, n, e.toNode)
使用==
对象的问题是(从这个问题开始):
java.lang.Object提供的equals()类的默认实现比较内存位置,并且仅当两个引用变量指向同一内存位置(即,它们实质上是同一对象)时才返回true。
这意味着两个变量必须指向相同的对象才能相等,例如:
scala> class A
defined class A
scala> new A
res0: A = A@4e931efa
scala> new A
res1: A = A@465670b4
scala> res0 == res1
res2: Boolean = false
scala> val res2 = res0
res2: A = A@4e931efa
scala> res2 == res0
res4: Boolean = true
在第一种情况下==
返回false是因为res0
和res1
指向两个不同的对象,在第二种情况下res2
则等于res0
因为它们指向同一对象。
在Slick中,列是对象中的抽象对象,因此拥有column1 == column2
的不是您要查找的内容,因此您想检查是否相等于列保持的值,而不是检查它们是否指向同一对象。然后,Slick可能===
用AST中的一个值相等来解释这一点(Library.==
是SqlOperator("=")
,n
是左侧的一列,e
是右侧的一列),但是Christopher可以比我更好地解释这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句