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() } 使它工作. 编辑:有没有任何解决方案可以让它工作而不必添加这个.? 解决方法
在这种情况下,您应该给编译器一个暗示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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |