Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么构造函数上的隐式转换需要';这个';?_Scala - Fatal编程技术网

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

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