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]
}
是两个不相关的事物,因为它们位于不同的命名空间等,并且 类型 ValueChanged 是 Event 的抽象子类型。
很好,然后我在 Scala 工作表中尝试:
type myString <: String
val myString: {
def myfunc(x: String): String
}
然后显示错误"only classes can have declared and undefined members"...这不是类似的构造吗?
最后问题是:
val ValueChanged 部分代码中的 ValueChanged 是什么?
它真的与 type ValueChanged <: Event
无关吗
这个语法是什么意思:
val myVal:{def func{x:T}:T}
?这里的值的名称、类型和实际值是什么?
谢谢!
{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 = {}
}
}
所有代码未经测试
我是 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
}
然后显示错误"only classes can have declared and undefined members"...这不是类似的构造吗?
最后问题是:
val ValueChanged 部分代码中的 ValueChanged 是什么?
它真的与 type ValueChanged <: Event
无关吗
这个语法是什么意思:
val myVal:{def func{x:T}:T}
?这里的值的名称、类型和实际值是什么?
谢谢!
{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 = {}
}
}
所有代码未经测试