【问题标题】:Why does Slick require using three equal signs (===) for comparison?为什么 Slick 需要使用三个等号 (===) 进行比较?
【发布时间】:2014-10-04 13:23:44
【问题描述】:

我正在阅读coming from SQL to Slick,它声明使用=== 而不是== 进行比较。

例如,

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

=====有什么区别,这里为什么用后者?

【问题讨论】:

  • 对于任何新来这里的人,请使用=!= 表示不等于。

标签: scala slick


【解决方案1】:

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

在 Slick 中,列被抽象为对象,因此 column1 == column2 不是您要查找的内容,您要检查列所包含值的相等性,而不是检查它们是否指向同一个对象。然后 Slick 可能会将 === 转换为 AST 中的值相等(Library.==SqlOperator("=")n 是左侧列,e 是右侧),但 Christopher 可以更好地解释这一点比我(如何,如何。

【讨论】:

  • 我用=~=!代替===!==,以及|&代替||&&,但是这根本不符合惯例,只是不喜欢嘈杂的 DSL 语法......
  • 我看不出它如何回答有关方法之间差异的问题 - ======== 提供了哪些 == 无法提供的功能?我会很感激一些解释。
  • 我的理解是,对于 Java,== 比较引用。在 Scala 中,通常== 是实际测试对象相等性的方法。例如,"abc"+"d" == "abcd" 在 Scala 中是 true。并且 Slick 中的 === 在某些情况下会进行一些额外的错误报告:stackoverflow.com/questions/10489548/… 并参见 scalatest.org/getting_started_with_fun_suite
  • 主要的一点是,虽然字符串可能==-彼此相等,但它们不==-等于 Slick 的 Column 对象。在这里重新定义 == 很容易出错,因此 Slick 定义了一个新方法。
【解决方案2】:

== 在 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 代表的表达式)。

【讨论】:

  • 我看不出它如何回答有关方法之间差异的问题 - ======== 提供哪些 == 无法提供的功能?我会很感激一些解释。
  • 当你同时使用 Slick 和 Scalatest 时它是如何工作的?
【解决方案3】:

'==' 仅比较值并得出布尔值“真”和“假”

'===' 完全比较(即比较值与其数据类型)并在列中产生结果

例子

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2016-11-11
    • 2016-02-24
    • 2018-05-01
    • 1970-01-01
    • 2016-03-28
    相关资源
    最近更新 更多