我正在阅读从SQL到Slick的内容,它表示要使用===而不是==用于比较.
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
Run Code Online (Sandbox Code Playgroud)
==和之间有什么区别===,为什么后者在这里使用?
End*_*Neu 13
==调用equals,===是一个自定义定义的方法,用于列比较:
def === [P2, R](e: Column[P2])(implicit om: o#arg[B1, P2]#to[Boolean, R]) =
om.column(Library.==, n, e.toNode)
Run Code Online (Sandbox Code Playgroud)
使用==对象的问题是这个(来自这个问题):
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
Run Code Online (Sandbox Code Playgroud)
在第一种情况下==返回false因为res0并res1指向两个不同的对象,在第二种情况下res2等于res0因为它们指向同一个对象.
在Slick列中,对象是抽象的,因此column1 == column2不是您要查找的内容,您希望检查列保持的值的相等性,而不是它们指向同一个对象.然后,Slick可能会转换===为AST中的值相等(Library.==是a SqlOperator("="),n是左侧列和e右侧),但Christopher可以比我更好地解释.
cvo*_*ogt 13
==Any在Scala中定义.Column[...]对于其他运营商来说,Slick不能超载它.这就是为什么光滑需要一个自定义运算符的平等.我们选择===了几个其他库,例如scalatest,scalaz等.
a == b将导致真或假.这是客户端比较.a === b将导致Column [Boolean]类型的对象,其后面有一个Library.Equals(a,b)实例,Slick将使用SQL"a = b"编译为服务器端比较(其中a和b由表达式a和b代替).
| 归档时间: |
|
| 查看次数: |
4699 次 |
| 最近记录: |