scala - 使用 <> 在 Scala 中模拟 !=

标签 scala emulation

我试图在 Scala 中用 <> 模拟 != 。

implicit def conditional[A](left : A) = new {
 |   def<>[A](right : A) = (left != right)
 | }

在什么情况下此仿真不起作用

最佳答案

这应该总是有效的,但可能不是你想象的那样。你期望这两种类型是一样的吗?如果是这样,应该是

class Conditionalize[A](left: A) { def <>(right: A) = left != right }
implicit def conditional[A](left: A) = new Conditionalize(left)

如果没有,使用单独的类型参数会更清楚:
implicit def notequality[A](a: A) = new { def <>[B](b: B) = a != b }

前者仅在 LHS 不需要隐式转换为与 RHS 相同的类型时才有效。定义有条件但不具有音符质量:
implicit def int_to_string(i: Int) = i.toString
scala> "5" <> 5
res0: Boolean = false

scala> 5 <> "5"
<console>:9: error: type mismatch;
 found   : java.lang.String("5")
 required: Int
       5 <> "5"

因为你不能链接隐式。

后一种情况将像 != 一样工作。 (编辑:关于 null 值的一个特殊情况,由于其类型 Null 。)

这两个都将包装原语,这会使繁重的工作变慢。但是 Scala 避免了 Java 的怪异之处 0.0 == -0.0但是 (new java.lang.Double(0.0)).equals(new java.lang.Double(-0.0))是假的,所以你不应该注意到结果的差异。

如果您愿意,可以添加 @specialized使比较器以额外的代码大小为代价避免装箱原语。

关于scala - 使用 <> 在 Scala 中模拟 !=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981582/

相关文章:

scala - Controller 操作未使用 "type mismatch found : Unit required: play.api.mvc.Result"进行编译

android - Phonegap "hello world"应用程序无法在 Android 模拟器中启动?

arrays - 如何在 Scala 中创建异构数组?

scala - 如何从查询结果中获取值

android - 如何在 ubuntu 14.04 中保持 android 模拟器始终在顶部

Android 应用程序无法在模拟器上启动

Android YouTube 应用播放视频 Intent

emulation - 接受多个客户端的 SMPP 服务器 (SMSC) 模拟器

scala - 是否可以获取运行时实例的 typeTag?

scala - 在Scala2中,如何使用隐式实现匹配类型?