self 类型类似于以下示例:
trait A { self: String => }
这就是说,特征A
(或其子类型)必须继承类String
。
关键字 self
后跟:
类似于 var s: String
中的变量,其中类型在 :
之后。
但是=>
在自我类型中状态是什么?这背后的原因是什么?
只是猜测工作...您需要一些自类型声明的特定分隔符。想象一下,=>
只是被省略了。 this: String
将是一个语法上有效的语句(尽管类型检查器会抱怨)。
那么哪个应该是分隔符呢?您不会想要像trait A { self: String { ... }}
这样的嵌套大括号。那么存在哪些非配对的现有分隔符? =>
是我唯一能想到的。
=>
在其他地方在哪里使用?作为函数类型(A => B
)和功能体(i: Int => i + 1
)的糖。也适用于按名称调用参数,以及模式匹配的情况。最后一种用法与 self 类型有些一致。这就像将this
匹配为特定类型,然后根据此"匹配"定义主体。我不知道,也许这是一个愚蠢的类比。
请注意,self
不是关键字,而是普通标识符。您确实可以编写任何其他有效的标识符来代替self
。:
表达式之后是类型归属,在表达式有效的任何地方都完全有效。
=>
告诉Scala有一个自我类型。否则,self: Type
看起来像一个简单的语句,一个表达式。例如:
class A
class B extends A {
this: A
}
这是有效的 Scala 代码,它没有自类型。
this
在类主体内部的范围内,所以从这个意义上说它是一个参数(尽管我们从来没有这样想过)。self-type 语法只是使它显式,并允许给它一个不同的名称(和类型)。因此,箭头成为活页夹与其范围之间的分隔符的非常好的选择。