【问题标题】:Scala instantiation of a class with curly braces带有花括号的类的 Scala 实例化
【发布时间】:2015-05-07 08:31:05
【问题描述】:

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

正在调用一个函数填充并为其分配一个 val(对我来说没有意义),这是填充定义

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

是一个返回值的函数

【问题讨论】:

    标签: scala scalafx


    【解决方案1】:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 2023-03-03
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      相关资源
      最近更新 更多