Scala val 语法:val myVal:{ def ... } 是什么意思?

Scala val syntax: What does val myVal:{ def ... } mean?

我是 Scala 和 funcprog 的新手。

我有一段代码(你们中的一些人可能认识它):

    trait SwingApi {

      type ValueChanged <: Event

      val ValueChanged: {
        def unapply(x: Event): Option[TextField]
      }
      ...
     }

我不明白 val ValueChanged: {...} 是什么。

从这个post我了解到

type ValueChanged <: Event

val ValueChanged: {
            def unapply(x: Event): Option[TextField]
          }

是两个不相关的事物,因为它们位于不同的命名空间等,并且 类型 ValueChangedEvent 的抽象子类型。

很好,然后我在 Scala 工作表中尝试:

type myString <: String

 val myString: {
    def myfunc(x: String): String
  }

然后显示错误"only classes can have declared and undefined members"...这不是类似的构造吗?

最后问题是:

?这里的值的名称、类型和实际值是什么?

谢谢!

{def unapply(x: Event): Option[TextField]}

是一个结构类型,这意味着它接受任何具有不应用方法的对象,该方法以事件作为参数,选项 [TextField] 作为 return 值。 它最常使用类似于 Duck typing,例如:

def foo(canQuack: {def quack(): Unit}) = {
  canQuack.quack()
}
object Bar{
   def quack(): Unit = print("quack")
}
object Baz{
   def bark(): Unit = print("bark")
}
foo(Bar) //works
foo(Baz) //compile error

所以

type StructuralType = {def unapply(x: Event): Option[TextField]}
val ValueChanged: StructuralType

声明了一个名为 ValueChanged 且类型为 StructuralType 的 val,但未分配任何值,这仅在特征或抽象中有意义 class,这就是您的示例不起作用的原因。

那又怎样

trait SwingApi {
...
  val ValueChanged: {
    def unapply(x: Event): Option[TextField]
  }
...
}

的意思是 SwingApi 特征只能应用于 Objects/Classes 具有名称为 ValueChanged 的​​ val 并且无论分配给它什么值,都有一个 unapply 方法

trait SwingApi {
  val ValueChanged: {
    def unapply(x: Event): Option[TextField]
  }
}
//works:
object Bar extends SwingApi{
  val ValueChanged = {
    def unapply(x: Event): Option[TextField] = None
  }
}
//compile error:
object Baz extends SwingApi{
  val ValueChanged = {
    //wrong name
    def foo(x: Event): Option[TextField] = None
  }
}
//compile error:
object Baz2 extends SwingApi{
  val ValueChanged = {
    //wrong input/output type
    def unapply(): Unit = {}
  }
}

所有代码未经测试