自我类型中`=>`背后的原因是什么?

时间:2012-06-30 20:48:20

标签: scala self-type

自我类型如下例所示:

trait A { self: String => }

这就是说,特征A(或其子类型)必须继承类String

关键字self后跟:类似于var s: String中的变量,其中类型位于:之后。

但是=>在自我类型中的状态是什么?这背后的原因是什么?

3 个答案:

答案 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在一个类体内的范围内,所以在这个意义上它是一个参数(尽管我们从来没有这么想过)。自我类型语法简单地使它显式化,并允许给它一个不同的名称(和类型)。因此,箭头成为粘合剂及其范围之间的分隔符的非常好的选择。