我想在Scala中使用<>模拟!=
implicit def conditional[A](left : A) = new {
| def<>[A](right : A) = (left != right)
| }
Run Code Online (Sandbox Code Playgroud)
这种模拟不起作用的情况是什么
这应该始终有效,但也许不是你想象的方式.你认为这两种类型是一样的吗?如果是这样,它应该是
class Conditionalize[A](left: A) { def <>(right: A) = left != right }
implicit def conditional[A](left: A) = new Conditionalize(left)
Run Code Online (Sandbox Code Playgroud)
如果没有,使用单独的类型参数更清楚:
implicit def notequality[A](a: A) = new { def <>[B](b: B) = a != b }
Run Code Online (Sandbox Code Playgroud)
前者只有在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"
Run Code Online (Sandbox Code Playgroud)
因为你不能链接暗示.
后一种情况就像!=.(编辑:null由于其类型,有一个关于值的特殊情况Null.)
这两个都将包装原语,这将使它在繁重的工作中变慢.但是Scala避免了Java的奇怪之处,0.0 == -0.0但却(new java.lang.Double(0.0)).equals(new java.lang.Double(-0.0))是错误的,所以你不应该注意到结果的差异.
如果你愿意,你可以添加,@specialized以使比较器避免装箱原语,代价是额外的代码大小.