Scala:隐式参数分辨率优先
假设我们只有局部范围的隐式参数查找:
trait CanFoo[A] { def foos(x: A): String } object Def { implicit object ImportIntFoo extends CanFoo[Int] { def foos(x: Int) = "ImportIntFoo:" + x.toString } } object Main { def test(): String = { implicit object LocalIntFoo extends CanFoo[Int] { def foos(x: Int) = "LocalIntFoo:" + x.toString } import Def._ foo(1) } def foo[A:CanFoo](x: A): String = implicitly[CanFoo[A]].foos(x) } 在上面的代码中,LocalIntFoo胜过ImportedIntFoo. 编辑: 名称绑定优先级是一个引人注目的论据,但有几个问题尚未解决.
第二,名称绑定优先级是关于将一??个已知的标识符x解析为特定成员pkg.A.B.x,以防在范围中有几个名为x的变量/方法/对象. ImportIntFoo和LocalIntFoo没有命名相同. 第三,我可以看出,这个名字绑定的优先级并不如下: trait CanFoo[A] { def foos(x: A): String } object Def { implicit object ImportIntFoo extends CanFoo[Int] { def foos(x: Int) = "ImportIntFoo:" + x.toString } } object Main { def test(): String = { implicit object LocalAnyFoo extends CanFoo[Any] { def foos(x: Any) = "LocalAnyFoo:" + x.toString } // implicit object LocalIntFoo extends CanFoo[Int] { // def foos(x: Int) = "LocalIntFoo:" + x.toString // } import Def._ foo(1) } def foo[A:CanFoo](x: A): String = implicitly[CanFoo[A]].foos(x) } println(Main.test) 将其放在test.scala中并运行scala test.scala,并打印出ImportIntFoo:1. 有关: > Where does Scala look for implicits? 这是隐式参数解析的一个很好的总结,但它引用了Josh的nescala演示文稿而不是规范.他的演讲是促使我研究的. 编译器实现 > 解决方法
我以博客文章
revisiting implicits without import tax的形式写了自己的答案.
更新:此外,Martin Odersky在上述帖子中的评论显示,Scala 2.9.1的LocalIntFoo胜过ImportedIntFoo的行为实际上是一个错误.见implicit parameter precedence again. > 1)通过本地声明,导入,外部范围,继承,无前缀访问的程序包对象,对当前调用范围可见的隐含. 如果在任一阶段我们发现多个隐式静态重载规则用于解决它. 更新2:当我问乔希关于没有进口税的申请时,他向我解释说,他指的是名称绑定规则,这些规则被命名完全一样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |