我想模仿!=<>在斯卡拉。
implicit def conditional[A](left : A) = new {
| def<>[A](right : A) = (left != right)
| }
此仿真无效的情况
答案 0 :(得分:7)
这应该始终有效,但也许不会像你想象的那样。你认为这两种类型是一样的吗?如果是这样,那应该是
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相同的类型时才有效。有条件但未定义notequality:
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避免了0.0 == -0.0
但(new java.lang.Double(0.0)).equals(new java.lang.Double(-0.0))
为假的Java的怪异,所以你不应该注意到结果的差异。
如果您愿意,可以添加@specialized
以使比较器避免以额外代码大小为代价来装箱原语。
答案 1 :(得分:4)
需要注意的一点是<>
的优先级与==
不同,所以有些东西在没有括号的情况下不起作用。例如:
a <> b >> 2 // (a <> b) >> 2
a != b >> 2 // a != (b >> 2)