在 Scala 的 Cats 之外是否有任何三重等于 === 方法?
Are there any triple equals === methods outside of Cats in Scala?
我花了一段时间在 Google 上搜索非 Cats 三重等于方法,但除了 Scalaz 之外找不到任何东西。不幸的是,我无法在该库中计算出 ===
的导入。
谁能帮忙,非常感谢。
如果你只需要 ===
,你可以很容易地用你自己的函数模仿猫的行为:
implicit class AnyWithTripleEquals[T](a: T) {
def ===(b: T): Boolean = a equals b
}
/*
scala> "2" === "3"
res0: Boolean = false
scala> "2" === 3
<console>:13: error: type mismatch;
found : Int(3)
required: String
"2" === 3
*/
我想到其他使用 ===
的库,例如:
- Slick 在查询中对
=
使用 ===
- http://slick.lightbend.com/doc/3.3.1/queries.html
- 测试框架中的匹配器,例如https://github.com/etorreborre/specs2/blob/8305db76c5084e4b3ce5827ce23117f6fb6beee4/matcher/shared/src/main/scala/org/specs2/matcher/TypedEqual.scala 使用
===
来检查断言并(通常)引发断言错误,有时会有一些不错的差异(我认为最严重?)
但它与 Cats/Scalaz 中的用例不同。
如果你想在猫中使用它,你需要:
- syntax -
import cats.syntax.eq._
or import cats.syntax.all._
or import cats.implicits._
(如果你重复导入语法,Scala 将无法恢复它)
- 实例 - 如果你比较 2
A
,你需要一个 cats.Eq[A]
的隐式实例。 List
s、Map
s 等的实例可以在 cats.instances.list._
、cats.instances.map._
、cats.instances.all._
或 cats.implicits._
中找到(与上述相同的规则) .所有 "normal" 类型都应该有实例,但如果您有自己的实例,则需要自己提供 Eq
实例或使用 Kittens. 之类的东西派生它
如果您遗漏了某些隐式(或者如果某些隐式是模棱两可的,因为您从两个不同的地方导入了相同的东西)语法将不起作用。
尽管导入和类型 类 将有其他名称,但 Scalaz 也一样。
如果您不介意某些性能损失(由 equals
中的 isInstanceOf
引起)以及相等性检查定义缺乏灵活性,您可以使用@sachav 的解决方案。
另一个提供 ===
的库是 scalactic,它基本上是 ScalaTest 使用的一组实用程序,它们被打包为一个单独的库。
import org.scalactic._
import TypeCheckedTripleEquals._
"Hello" === "Hello" //true
1 === "Hello" //won't compile
您还可以"configure"如何使用隐式解决您的平等问题:
import org.scalactic._
import TripleEquals._
import StringNormalizations._
import Explicitly._
implicit val strEquality = decided by defaultEquality[String] afterBeing lowerCased
"Hello" === "hello" // true
"normalized" === "NORMALIZED" // true
关于 scalaz 尝试
import scalaz._
import Scalaz._
42 === "hello" // error: type mismatch; found: String("hello") required: Int
哪里
libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.28"
我花了一段时间在 Google 上搜索非 Cats 三重等于方法,但除了 Scalaz 之外找不到任何东西。不幸的是,我无法在该库中计算出 ===
的导入。
谁能帮忙,非常感谢。
如果你只需要 ===
,你可以很容易地用你自己的函数模仿猫的行为:
implicit class AnyWithTripleEquals[T](a: T) {
def ===(b: T): Boolean = a equals b
}
/*
scala> "2" === "3"
res0: Boolean = false
scala> "2" === 3
<console>:13: error: type mismatch;
found : Int(3)
required: String
"2" === 3
*/
我想到其他使用 ===
的库,例如:
- Slick 在查询中对
=
使用===
- http://slick.lightbend.com/doc/3.3.1/queries.html - 测试框架中的匹配器,例如https://github.com/etorreborre/specs2/blob/8305db76c5084e4b3ce5827ce23117f6fb6beee4/matcher/shared/src/main/scala/org/specs2/matcher/TypedEqual.scala 使用
===
来检查断言并(通常)引发断言错误,有时会有一些不错的差异(我认为最严重?)
但它与 Cats/Scalaz 中的用例不同。
如果你想在猫中使用它,你需要:
- syntax -
import cats.syntax.eq._
orimport cats.syntax.all._
orimport cats.implicits._
(如果你重复导入语法,Scala 将无法恢复它) - 实例 - 如果你比较 2
A
,你需要一个cats.Eq[A]
的隐式实例。List
s、Map
s 等的实例可以在cats.instances.list._
、cats.instances.map._
、cats.instances.all._
或cats.implicits._
中找到(与上述相同的规则) .所有 "normal" 类型都应该有实例,但如果您有自己的实例,则需要自己提供Eq
实例或使用 Kittens. 之类的东西派生它
如果您遗漏了某些隐式(或者如果某些隐式是模棱两可的,因为您从两个不同的地方导入了相同的东西)语法将不起作用。
尽管导入和类型 类 将有其他名称,但 Scalaz 也一样。
如果您不介意某些性能损失(由 equals
中的 isInstanceOf
引起)以及相等性检查定义缺乏灵活性,您可以使用@sachav 的解决方案。
另一个提供 ===
的库是 scalactic,它基本上是 ScalaTest 使用的一组实用程序,它们被打包为一个单独的库。
import org.scalactic._
import TypeCheckedTripleEquals._
"Hello" === "Hello" //true
1 === "Hello" //won't compile
您还可以"configure"如何使用隐式解决您的平等问题:
import org.scalactic._
import TripleEquals._
import StringNormalizations._
import Explicitly._
implicit val strEquality = decided by defaultEquality[String] afterBeing lowerCased
"Hello" === "hello" // true
"normalized" === "NORMALIZED" // true
关于 scalaz 尝试
import scalaz._
import Scalaz._
42 === "hello" // error: type mismatch; found: String("hello") required: Int
哪里
libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.28"