【发布时间】:2014-10-04 13:23:44
【问题描述】:
我正在阅读coming from SQL to Slick,它声明使用=== 而不是== 进行比较。
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
==和===有什么区别,这里为什么用后者?
【问题讨论】:
-
对于任何新来这里的人,请使用
=!=表示不等于。
我正在阅读coming from SQL to Slick,它声明使用=== 而不是== 进行比较。
例如,
people.filter(p => p.age >= 18 && p.name === "C. Vogt").run
==和===有什么区别,这里为什么用后者?
【问题讨论】:
=!= 表示不等于。
==调用equals,===是slick中自定义的方法,用于列比较:
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 是右侧),但 Christopher 可以更好地解释这一点比我(如何,如何。
【讨论】:
=~和=!代替===和!==,以及|和&代替||和&&,但是这根本不符合惯例,只是不喜欢嘈杂的 DSL 语法......
== 与 ===。 === 提供了哪些 == 无法提供的功能?我会很感激一些解释。
== 比较引用。在 Scala 中,通常== 是实际测试对象相等性的方法。例如,"abc"+"d" == "abcd" 在 Scala 中是 true。并且 Slick 中的 === 在某些情况下会进行一些额外的错误报告:stackoverflow.com/questions/10489548/… 并参见 scalatest.org/getting_started_with_fun_suite
==-彼此相等,但它们不==-等于 Slick 的 Column 对象。在这里重新定义 == 很容易出错,因此 Slick 定义了一个新方法。
== 在 Scala 中的 Any 上定义。 Slick 不能像其他运算符那样为 Column[...] 类型重载它。这就是为什么 slick 需要一个自定义运算符来实现相等。我们选择了===,就像其他几个库一样,例如scalatest、scalaz等。
a == b 会导致真假。这是一个客户端比较。 a === b 将导致一个 Column[Boolean] 类型的对象,后面有一个 Library.Equals(a,b) 的实例,Slick 将使用 SQL "a = b" 将其编译为服务器端比较(其中 a 和 b 被替换为 a 和 b 代表的表达式)。
【讨论】:
== 与 ===。 === 提供哪些 == 无法提供的功能?我会很感激一些解释。
'==' 仅比较值并得出布尔值“真”和“假”
'===' 完全比较(即比较值与其数据类型)并在列中产生结果
例子
1=='1' 真 1==='1' 错误
【讨论】: