使用<>在scala中模拟!=

时间:2010-10-20 19:30:37

标签: scala emulation

我想模仿!=<>在斯卡拉。

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

此仿真无效的情况

2 个答案:

答案 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)