加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:03:16 所属栏目:安全 来源:网络整理
导读:考虑以下典型的 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编译器不一样吗? 编辑:
考虑以下典型的 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读