考虑以下典型的
Scala‘pimp’代码:
class PimpedA(a:A){ def pimp() = "hi" } implicit def pimpA(a:A) = new PimpedA(a) new A(){ pimp() //<--- does not compile }
但是,将其更改为:
new A(){ this.pimp() }
使它工作.
它应该与Scala编译器不一样吗?
解决方法
在这种情况下,您应该给编译器一个暗示pimp()不是随机函数的提示.当你写作
this.pimp()
编译器知道A类上没有pimp函数所以它是一个错误,在放弃它之前搜索范围内的隐式转换并找到它.
pimpA(this).pimp()
而当你刚刚调用pimp()时,编译器不知道将哪个对象传递给pimpA(a:A)隐式函数.
UPDATE
很难理解你的目标是什么.我只能建议让PimpedA成为类型类(本例中为Pimp [T]).
trait Pimp[T] { def action(p: T): String } implicit object PimpA extends Pimp[A] { override def action(p: A) = "some actions related to A" } def pimp[T: Pimp](p: T) = implicitly[Pimp[T]].action(p) class A { val foo = pimp(this) } scala> new A foo res2: String = some actions related to A