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