隐式转换符号

时间:2017-05-14 16:36:40

标签: scala implicits

我试图通过两个含义级别隐含地向Symbol类添加函数(如here所述)。 请考虑以下代码:

case class A(s: Symbol)
case class B(s: A) {
  def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s))
}
implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s))
implicit def symbolToA(s: Symbol) = A(s)

val x = 'a + 'b

此程序无法编译:

  

错误:值+不是符号

的成员

似乎问题在于,scala不会选择剪切中定义的隐含,而是使用'a函数转换any2stringadd。事实上,以下两个实验似乎使代码编译:

  • 我可以使用不同的函数名称而不是+(例如add
  • 我可以在导入any2stringadd
  • 中明确地隐藏import Predef.{any2stringadd => _ , _}

我不喜欢这两种解决方案。我的问题是,还有其他方法可以改写我的程序来说服scala选择我的暗示吗?

注意:我正在使用scala 2.12.1。有趣的是,IntelliJ并没有抱怨这个片段。

1 个答案:

答案 0 :(得分:1)

你可以将另一个名为any2stringadd的东西带入范围。

object myDsl {
  object any2stringadd

  case class A(s: Symbol)
  case class B(s: A) {
    def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s))
  }
  implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s))
  implicit def symbolToA(s: Symbol) = A(s)
}

import myDsl._
val x = 'a + 'b