有没有办法使用implicits初始化匿名对象而不重复“this。”?

时间:2013-06-23 19:57:11

标签: scala

例如,我有一个增强JavaFX Label类的隐式类。简而言之:

class EnhanceLabel(val l: Label) extends AnyVal {
    def opacity = l.getOpacity
    def opacity_= (d: Double) { l.setOpacity(s) }
}

object EnhanceLabel {
  implicit def enhanceLabel(x: Label) = new EnhanceLabel(x)
}

我试图像这样使用它(在导入隐式def enhanceLabel之后):

val l = new Label() {
    opacity = 0.5
}

这不编译。错误信息是:

not found: value opacity
    opacity = 0.5
    ^

我必须这样做:

val l = new Label() {
    this.opacity = 0.5
}

我认为这是因为不透明度设定器来自隐式转换?是否需要“this”来搜索隐式转换?如果它丢失了,它不会假设“这个”吗?如果我把它扩大很多,我最终会得到无数的“这个”。关键字对我来说似乎是多余的。当然我可以把它缩短为“x”。或类似的东西,但我想完全摆脱它。

任何提示都表示赞赏。

柯蒂斯

1 个答案:

答案 0 :(得分:1)

根据给定的代码,您不是从text类调用EnhanceLabel,而是尝试将值分配给Labeled类的text字段。此处也未使用隐式转换,因为 Labeled 类中存在text字段,不会引发异常。 Scala尝试将隐式转换作为编译程序的最后机会。

Scala将EnhanceLabel在以下情况中:

implicit class EnhanceLabel(val l: Label) {
  var enhanced = _
}

val l = new Label("Text")
l.enhanced = "Other text"