为什么Slick需要使用三个等号(===)进行比较?

时间:2014-10-04 13:23:45

标签: scala slick

我正在阅读coming from SQL to Slick,并声明使用===代替==进行比较。

例如,

people.filter(p => p.age >= 18 && p.name === "C. Vogt").run

=====之间有什么区别,为什么后者会在这里使用?

3 个答案:

答案 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,因为res0res1指向两个不同的对象,在第二种情况下res2等于res0,因为他们指向同一个对象。

在Slick列中,对象是抽象的,因此column1 == column2不是您要查找的内容,您希望检查列保持的值的相等性,而不是它们指向同一个对象。然后,Slick可能会将===转换为AST中的值相等(Library.==SqlOperator("=")n是左侧列,e是右侧手边),但克里斯托弗可以比我更好地解释。

答案 2 :(得分:-2)

  

'=='仅比较值并产生布尔'真'& '错误

     

'==='完全比较(即将值与其数据类型进行比较)并得到列

例如

1 =='1'真 1 ==='1'错误