Scala 为什么构造函数上的隐式转换需要';这个';?
考虑以下典型的Scala“皮条客”代码:Scala 为什么构造函数上的隐式转换需要';这个';?,scala,Scala,考虑以下典型的Scala“皮条客”代码: class PimpedA(a:A){ def pimp() = "hi" } implicit def pimpA(a:A) = new PimpedA(a) new A(){ pimp() //<--- does not compile } 让它工作。 它对Scala编译器不应该是一样的吗 编辑:是否有任何解决方案可以使其工作而不必添加this.?在这种情况下,您应该向编译器提示pimp()不是随机函数。当你写作时 this.pi
class PimpedA(a:A){
def pimp() = "hi"
}
implicit def pimpA(a:A) = new PimpedA(a)
new A(){
pimp() //<--- does not compile
}
让它工作。
它对Scala编译器不应该是一样的吗
编辑:是否有任何解决方案可以使其工作而不必添加
this.
?在这种情况下,您应该向编译器提示pimp()
不是随机函数。当你写作时
this.pimp()
编译器知道类A
上没有pimp
函数,所以这是一个错误,在放弃之前,它在作用域中搜索隐式转换并找到它
pimpA(this).pimp()
当您只调用pimp()
时,编译器不知道传递给pimpA(a:a)
隐式函数的对象是什么
更新
很难理解你的目标是什么。我只能建议将PimpedA
设置为typeclass(Pimp[T]
)
一点也不。要使其工作,
pimp
需要是对象或值的导入成员,两者都不是。一个类有一个“隐式的”导入它。
。它没有一种机制,可以自动在this
前面加上前缀以查看它是否编译。只是说:惯例是只有具有副作用的方法才用空括号声明。这并不是说它错了,但在您的情况下,def pimp=“hi”
就足够了。@LeChe谢谢您的提示。Java习惯…:)告诉我:我花了很长时间才摆脱它们……:)我的目标是扩展Java库API,使其更为Scala友好。在我的示例中,类A将是Java类,因此不能更改。(我已经更新了我的示例,以明确我没有实现A类)@hbatista,现在明白了。然后,丹尼尔的回答准确地解释了为什么它不起作用。
pimpA(this).pimp()
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