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

前端之家收集整理的这篇文章主要介绍了scala – 为什么构造函数的隐式转换需要’this’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑以下典型的 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

猜你在找的Scala相关文章