我试图通过两个含义级别隐含地向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并没有抱怨这个片段。
答案 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