隐式转换 Symbol 时隐藏 any2stringadd
Shadow any2stringadd when implicitly converting Symbol
我正在尝试通过两级隐式(如 here 所述)向 Symbol
class 隐式添加函数。
考虑以下代码:
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
此程序无法编译:
Error: value + is not a member of Symbol
似乎问题在于,scala 没有选择片段中定义的隐式,而是使用 any2stringadd
函数转换 'a
。事实上,以下两个实验似乎使代码编译通过:
- 我可以使用不同的函数名称而不是
+
(例如 add
)
- 我可以在导入中显式隐藏
any2stringadd
:import Predef.{any2stringadd => _ , _}
我都不喜欢这两种解决方案。我的问题是,是否有任何其他方法可以改写我的程序以说服 Scala 改用 select 我的隐含函数?
注意:我使用的是 scala 2.12.1。有趣的是,IntelliJ 并没有抱怨这个片段。
您可以将另一个名为 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
我正在尝试通过两级隐式(如 here 所述)向 Symbol
class 隐式添加函数。
考虑以下代码:
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
此程序无法编译:
Error: value + is not a member of Symbol
似乎问题在于,scala 没有选择片段中定义的隐式,而是使用 any2stringadd
函数转换 'a
。事实上,以下两个实验似乎使代码编译通过:
- 我可以使用不同的函数名称而不是
+
(例如add
) - 我可以在导入中显式隐藏
any2stringadd
:import Predef.{any2stringadd => _ , _}
我都不喜欢这两种解决方案。我的问题是,是否有任何其他方法可以改写我的程序以说服 Scala 改用 select 我的隐含函数?
注意:我使用的是 scala 2.12.1。有趣的是,IntelliJ 并没有抱怨这个片段。
您可以将另一个名为 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