Function Scala val语法:val myVal:{def…}是什么意思?
我是Scala和funcprog的新手 我有一段代码(你们中的一些人可能会认出它): 是两个不相关的事物,因为它们位于不同的名称空间等,而类型ValueChanged是事件的抽象子类型 很好,然后我在Scala工作表中尝试: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方法的任何对象,该方法以事件作为参数
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 = {}
}
}