带有花括号的类的Scala实例化

时间:2015-03-05 20:14:29

标签: scala scalafx

我从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

            }
          }
        )

      }

    }

  }

}

我不理解的部分是为什么创建一个匿名类后面是花括号(有一些更多的声明)(场景不是填充该类的抽象部分的轨迹)甚至填充或内容是函数而不是变量而黑色用于填充瞬间是val意味着这一行

fill = Black

正在调用函数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

是一个返回值的函数

2 个答案:

答案 0 :(得分:3)

您看到的匿名类是Java的double brace initialization的Scala版本。创建对象时,将评估这些大括号内的所有内容。您可以在here(第二页左右)找到更多相关信息。

对于函数的赋值,你会看到一段Scala的语法糖,通常用于getter和setter。基本上,如果一个对象有一个定义的方法,如def fill_=(value:Color),那么可以使用你看到的语法调用它。 This answer稍微描述了这个功能。

因此,您正在查看的方法def fill: ObjectProperty[jfxsp.Paint] = delegate.fillProperty实际上与您看到的任务无关,至少从语言角度来看。这是因为fill_=方法将在类中定义。

答案 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)贬低了。