Scala中使用花括号实例化类

3
我开始学习Scala和ScalaFX,我理解大部分代码,但我不理解在ScalaFx示例中使用的这段代码;
在其中实例化一个匿名类,然后跟随花括号,这是如何工作的?
object ScalaFXHelloWorld extends JFXApp {

  stage = new PrimaryStage {

    title = "ScalaFX Hello World"

    scene = new Scene {

      fill = Black

      content = new HBox {

        padding = Insets(20)

        children = Seq(
          new Text {
            text = "Hello"
            style = "-fx-font-size: 48pt"
            fill = new LinearGradient(
              endX = 0,
              stops = Stops(PaleGreen, SeaGreen)
            )
          },
          new Text {
            text = "World!!!"
            style = "-fx-font-size: 48pt"
            fill = new LinearGradient(
              endX = 0,
              stops = Stops(Cyan, DodgerBlue)
            )
            effect = new DropShadow {
              color = DodgerBlue
              radius = 25
              spread = 0.25

            }
          }
        )

      }

    }

  }

}

我不理解的部分是为什么创建匿名类后面要跟着花括号(里面有更多声明)。其中 Scene 不是填充该类抽象部分的轨迹,fill 或 content 也不是变量而是函数。例如,Black for fill 是 val 类型,这意味着该行代码

fill = Black

执行调用 fill 函数并将一个值分配给它(对我来说没有意义),这是 fill 的定义。
def fill: ObjectProperty[jfxsp.Paint] = delegate.fillProperty

这是黑色字体

val Black = new Color(jfxsp.Color.BLACK)

请帮忙解释一下使用花括号实例化新对象的工作原理,我想要理解。

这是因为ScalaFx正在包装JavaFx,这里发生了一些特殊的事情吗?

谢谢大家。

更新:

现在我知道它通过语法糖调用了一个setter,但我检查了那个setter,不明白里面发生了什么。

看看这个:

def fill: ObjectProperty[jfxsp.Paint] = delegate.fillProperty
  def fill_=(v: Paint) {
    fill() = v
}

为什么setter调用getter来更新值?

delegate.fillProperty是一个返回值的函数。

1个回答

0

Scala中匿名类的语法是从Java借鉴来的,你也可以在这里看到它:

class Coder {
    protected String name;
    public Coder(String name) {this.name = name;}
}

public static void main(String[] args) {
    // Prints "Mr. Noble"
    new Coder("Noble") {
        private String prefix = "Mr.";
        {
           System.out.println(prefix + " " + name);
        }
    }
}

因为Scala允许您在类体中编写构造函数代码,所以当您实例化这些匿名类时,所有x = y语句都会被执行。正如@resueman指出的那样,在此格式中,这些实际上是getter和setter:

class Scene { 
    var _fill
    def fill_=(color: Color) // Setter, has some hidden logic to set up the UI
    def fill = _fill // Getter
}

而你的语句 fill = Black 被展开为 fill_=(Black)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接