我是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]
          }


是两个不相关的事物,因为它们位于不同的名称空间等中,而ValueChanged类型是Event的抽象子类型。

好,那么我尝试在Scala工作表中:

type myString <: String

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


它向我显示了一个错误“只有类可以具有声明的和未定义的成员”……这不是类似的构造吗?

最后,问题是:


代码的val ValueChanged部分中的ValueChanged是什么?
是否真的与ValueChanged 这个语法是什么意思:

val myVal:{def func {x:T}:T}


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

谢谢!

最佳答案

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


是一种结构类型,它表示它接受具有unapply方法且Object以Event作为参数,Option [TextField]作为返回值的任何对象。
最常用的方式类似于Duck的输入法,例如:

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且类型为Type StructuralType的val,但不分配任何值,这仅在特征或抽象类中有意义,这就是您的示例不起作用的原因。

所以呢

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


这意味着特征SwingApi仅可应用于具有val且名称为ValueChanged的对象/类,并且为其分配的任何值均具有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 = {}
  }
}


所有代码未经测试

09-10 15:57