2014-10-04 39 views

回答

11

==呼叫为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,即基本上它们是a重新相同的对象。

这意味着两个变量必须指向相同的对象是相等的,例如:

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 

==返回false第一种情况下,因为res0res1指向两个不同的对象,在第二种情况res2等于res0,因为它们指向相同的对象。

在Slick列被抽象为对象,因此column1 == column2不是您正在查找的内容,您希望检查列的值是否相等,而不是指向同一个对象。 Slick然后可能翻译在AST中的值相等的===Library.==SqlOperator("="),n是左侧栏和e右侧),但克里斯托弗可以解释,比我好。

+0

我使用'=〜'和'= !'代替'==='和'!==',以及代替'||'和'&&'的'|'和'&,但这并不符合惯例,只是不喜欢嘈杂DSL语法... – virtualeyes 2014-10-04 19:31:16

+0

我不明白它如何回答关于方法之间区别的问题 - '=='和'==='。 '==='提供的== =='不能做什么?我会很感激一些解释。 – 2014-10-05 13:49:40

+0

@JacekLaskowski你有一个观点。 – 2014-10-05 14:14:28

12

==定义在斯卡拉的Any。对于Column[...]类型,Slick不能超载,类似于其他操作员可以使用的类型。这就是为什么光滑需要一个自定义运算符的平等。我们选择了===就像其他几个库,如scalatest,scalaz等。

a == b会导致错误。这是一个客户端比较。 a === b将导致一个类型为Column [Boolean]的对象,其后面有一个Library.Equals(a,b)实例,Slick将使用SQL“a = b”编译为服务器端比较。 (其中a和b被表达式a和b代替)。

+0

我不明白它是如何回答有关方法之间差异的问题 - “==”和“===”。 '==='提供的== =='不能做什么?我会很感激一些解释。 – 2014-10-05 13:49:10

+0

更新了答案 – cvogt 2014-10-05 16:57:22

+0

当你使用Slick和Scalatest时它是如何工作的? – 2017-09-05 08:07:41

-1

'==' 仅比较值,并导致在布尔 '真' &“假

'===' 比较完全地(即比较其数据类型的值),并导致柱

例如

1 == '1' 真 1 === '1' 假

相关问题