我正在通过coming from SQL to Slick进行阅读,并声明使用===
代替==
进行比较。为什么Slick需要使用三个等号(===)进行比较?
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
是什么==
和===
之间的区别,为什么这里使用后者?
我正在通过coming from SQL to Slick进行阅读,并声明使用===
代替==
进行比较。为什么Slick需要使用三个等号(===)进行比较?
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
是什么==
和===
之间的区别,为什么这里使用后者?
==
呼叫为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第一种情况下,因为res0
和res1
指向两个不同的对象,在第二种情况res2
等于res0
,因为它们指向相同的对象。
在Slick列被抽象为对象,因此column1 == column2
不是您正在查找的内容,您希望检查列的值是否相等,而不是指向同一个对象。 Slick然后可能翻译在AST中的值相等的===
(Library.==
是SqlOperator("=")
,n
是左侧栏和e
右侧),但克里斯托弗可以解释,比我好。
==
定义在斯卡拉的Any
。对于Column[...]
类型,Slick不能超载,类似于其他操作员可以使用的类型。这就是为什么光滑需要一个自定义运算符的平等。我们选择了===
就像其他几个库,如scalatest,scalaz等。
a == b会导致错误。这是一个客户端比较。 a === b将导致一个类型为Column [Boolean]的对象,其后面有一个Library.Equals(a,b)实例,Slick将使用SQL“a = b”编译为服务器端比较。 (其中a和b被表达式a和b代替)。
我不明白它是如何回答有关方法之间差异的问题 - “==”和“===”。 '==='提供的== =='不能做什么?我会很感激一些解释。 – 2014-10-05 13:49:10
更新了答案 – cvogt 2014-10-05 16:57:22
当你使用Slick和Scalatest时它是如何工作的? – 2017-09-05 08:07:41
'==' 仅比较值,并导致在布尔 '真' &“假
'===' 比较完全地(即比较其数据类型的值),并导致柱
例如
1 == '1' 真 1 === '1' 假
我使用'=〜'和'= !'代替'==='和'!==',以及代替'||'和'&&'的'|'和'&,但这并不符合惯例,只是不喜欢嘈杂DSL语法... – virtualeyes 2014-10-04 19:31:16
我不明白它如何回答关于方法之间区别的问题 - '=='和'==='。 '==='提供的== =='不能做什么?我会很感激一些解释。 – 2014-10-05 13:49:40
@JacekLaskowski你有一个观点。 – 2014-10-05 14:14:28