【问题标题】:Scala implicit conversion on IntsInts 上的 Scala 隐式转换
【发布时间】:2015-12-15 22:01:38
【问题描述】:

假设我有以下方法:

  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)
  }

以这种方式工作,首先它总结了所有元素,然后创建生成的环:

([14]左->空,右->空)

是否有可能实现“不贪婪”的隐式转换来实现我想要的?

【问题讨论】:

  • 拨打main时,您希望得到什么结果? Ring(14)?
  • ( [2] left-> ( [-1] left-> null, right-> null), right-> ( [3] left-> null, right-> ( [10] left-> null, right-> null)))
  • 我不清楚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))) 的。能多说点吗?
  • 我已经覆盖了 tostring 方法,但它并不相关,这就是我没有粘贴它的原因。看看@shadowslands 的答案,他明白了。

标签: scala implicit-conversion


【解决方案1】:

您应该能够通过显式转换第一个 Int 来做到这一点:

val r = (2: Ring) + 3 + (-1) + 10

这迫使编译器寻找一种将“3”添加到 Ring 的方法,这应该强制进行隐式转换,否则它可以愉快地使用整数加法,而无需寻找隐式转换。

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

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

并使用该运算符:

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

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2019-04-01
    • 2012-04-15
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多