为什么构造函数的隐式转换需要'this'?

时间:2011-11-19 19:49:55

标签: scala

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

2 个答案:

答案 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