我正在阅读coming from SQL to Slick,并声明使用===
代替==
进行比较。
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
==
和===
之间有什么区别,为什么后者会在这里使用?
答案 0 :(得分:13)
==
在Scala中的Any
上定义。对于Column[...]
类型,Slick不能为其他运算符重载它。这就是为什么光滑需要一个自定义运算符的平等。我们选择===
就像其他几个库一样,例如scalatest,scalaz等。
a == b会导致真或假。这是客户端比较。 a === b将导致Column [Boolean]类型的对象,其后面有一个Library.Equals(a,b)实例,Slick将使用SQL“a = b”编译为服务器端比较(其中a和b由表达式a和b代替)。
答案 1 :(得分:12)
==
调用equals
,===
是一个自定义定义的方法,用于列比较:
def === [P2, R](e: Column[P2])(implicit om: o#arg[B1, P2]#to[Boolean, R]) =
om.column(Library.==, n, e.toNode)
对象使用==
的问题是这个问题(来自this question):
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
是右侧手边),但克里斯托弗可以比我更好地解释。
答案 2 :(得分:-2)
'=='仅比较值并产生布尔'真'& '错误
'==='完全比较(即将值与其数据类型进行比较)并得到列
例如
1 =='1'真 1 ==='1'错误