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

Function Scala val语法:val myVal:{def…}是什么意思?,function,scala,declaration,subtyping,Function,Scala,Declaration,Subtyping,我是Scala和funcprog的新手 我有一段代码(你们中的一些人可能会认出它): 是两个不相关的事物,因为它们位于不同的名称空间等,而类型ValueChanged是事件的抽象子类型 很好,然后我在Scala工作表中尝试: type myString <: String val myString: { def myfunc(x: String): String } 键入myString 是一种结构类型,这意味着它接受具有unapply方法的任何对象,该方法以事件作为参数

我是Scala和funcprog的新手

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

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

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

type myString <: String

 val myString: {
    def myfunc(x: String): String
  }
键入myString
是一种结构类型,这意味着它接受具有unapply方法的任何对象,该方法以事件作为参数,选项[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
所以

声明一个名为ValueChanged、类型为structureType的val,但不赋值,这仅在trait或抽象类中有意义,这就是示例不起作用的原因

那又怎样

trait SwingApi {
...
  val ValueChanged: {
    def unapply(x: Event): Option[TextField]
  }
...
}
这意味着trait SwingApi只能应用于具有名称为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 = {}
  }
}

所有未经测试的代码

非常感谢您用示例进行的详细解释!再清楚不过了!
{def unapply(x: Event): Option[TextField]}
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
trait SwingApi {
...
  val ValueChanged: {
    def unapply(x: Event): Option[TextField]
  }
...
}
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 = {}
  }
}