我试图在 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/