考虑以下典型的 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/

10-12 13:53