考虑以下典型的 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.
? 最佳答案
在这种情况下,您应该向编译器提示 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
关于scala - 为什么构造函数上的隐式转换需要 'this' ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8196794/