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



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 语法只是使它显式,并允许给它一个不同的名称(和类型)。因此,箭头成为活页夹与其范围之间的分隔符的非常好的选择。

最新更新