考虑以下典型的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编译器不一样吗?
编辑:是否有任何解决方案可以让它工作而无需添加this.
?
答案 0 :(得分:5)
完全没有。为了使它工作,pimp
需要是一个对象或一个值的导入成员,它既不是。一个类有一个“隐式”import this._
。它有不一种机制,可以自动预先设置this
以查看是否编译。
答案 1 :(得分:2)
在这种情况下,您应该给编译器一个pimp()
不是随机函数的提示。当你写
this.pimp()
编译器知道类pimp
上没有A
函数,所以这是一个错误,在放弃之前搜索范围内的隐式转换并找到它。
pimpA(this).pimp()
当你只是调用pimp()
时,编译器不知道要传递给pimpA(a: A)
隐式函数的对象。
很难理解你的目标是什么。我只能建议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