Iala上的Scala隐式转换

时间:2015-12-15 22:01:38

标签: scala implicit-conversion

假设我有以下方法:

  def main(args: Array[String]): Unit = {
    println(Ring(2) + Ring(3) + Ring(-1) + Ring(10))
  }

产生:

  

([2] left->([ - 1] left-> null,right-> null),right->([3] left->   null,right-> ([10] left-> null,right-> null)))

我想编写一个隐式转换,它允许我以下列方式编写代码:

 def main(args: Array[String]): Unit = {
    val r :Ring = 2 + 3 + (-1) + 10
    println(r)
  }

但是遵循隐式方法

  implicit def intToRing(x :Int): Ring = {
    new Ring(x)
  }

以这种方式工作首先它总结所有元素,然后创建Ring产生的东西:

  

([14] left-> null,right-> null)

是否有可能实施“不贪婪”'隐式转换会产生我想要的东西吗?

1 个答案:

答案 0 :(得分:6)

你应该能够通过显式地转换第一个Int:

来做到这一点
val r = (2: Ring) + 3 + (-1) + 10

这迫使编译器寻找一种方法来添加" 3"到Ring,这应该强制隐式转换,否则它可以愉快地使用整数加法而不需要寻找隐式转换。

我能想到的另一种方法是为Ring提供一个替代方法名称(直接或通过隐式包装类等),例如:

def +^(other: Ring): Ring = this + other

并使用该运算符:

val r = 2 +^ 3 +^ (-1) +^ 10