自类型的示例如下:
trait A { self: String => }
这意味着特征A
(或其子类型)必须继承类String
。
关键字self
后面跟着:
,类似于变量var s: String
中类型在:
后面的位置。
但是,在自类型中=>
表示什么?这背后的原因是什么?
只是猜测而已...你需要一些特定的自身类型声明的分隔符。想象一下,如果省略了=>
,this: String
将是一个语法上有效的语句(虽然类型检查器会抱怨)。
那么应该选择哪个分隔符呢?你不想要嵌套的大括号,比如trait A { self: String { ... }}
。那么哪些现有的非成对分隔符存在呢?我能想到的只有=>
。
=>
在其他地方用于哪里?作为函数类型的语法糖 (A => B
) 和函数体 (i: Int => i + 1
)。也用于按名称调用的参数以及模式匹配的情况。这种最后一种用法与自身类型有些连贯。就像将this
与特定类型进行匹配,然后根据这个“匹配”来定义函数体。我不知道,也许这个类比有点傻。
self
不是关键字,而是普通标识符。您可以在 self
的位置上编写任何其他有效的标识符。在表达式后面添加 :
是一种类型注释,无论在表达式有效的任何地方都是完全有效的。
=>
告诉 Scala 存在自身类型。否则,self: Type
看起来就像一个简单的语句或表达式。例如:class A
class B extends A {
this: A
}
这是有效的Scala代码,且没有自类型。
=>
作为自类型符号的具体原因是什么,还是只是因为它与Scala语法的其他部分很搭配? - John Threepwoodthis
在类的主体内部是可见的,所以从这个意义上说它是一个参数(尽管我们从来没有这样考虑过)。self-type 语法只是使其明确,并允许给它一个不同的名称(和类型)。因此,箭头成为将绑定器和其作用域分隔开的一个非常好的选择。