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

Joh*_*ood 14 scala self-type

self类型类似于以下示例:

trait A { self: String => }
Run Code Online (Sandbox Code Playgroud)

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

该关键字self后跟:类似于变量in var s: String,其中类型为after :.

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

0__*_*0__ 11

猜猜工作......你需要一些自我类型声明的特定分隔符.想象一下,=>只是省略了.this: String将是一个语法上有效的语句(虽然类型检查器会抱怨).

哪个应该是分隔符?你不会想要嵌套的大括号trait A { self: String { ... }}.那么哪些非配对的现有分隔符存在?=>是我唯一能想到的.

=>别处使用的地方?作为函数类型(A => B)和函数体(i: Int => i + 1)的糖.也适用于按名称调用的参数,以及模式匹配的情况.最后一种用法与自我类型有些一致.这就像匹配this特定类型,然后根据这个'匹配'定义正文.我不知道,也许这是一个愚蠢的比喻.


Dan*_*ral 10

请注意,这self不是关键字,而是普通标识符.您可以真正编写任何其他有效的标识符来代替self.并且:在表达式是类型归属之后,在表达式有效的任何地方都可以完全有效.

=>是告诉Scala有自我类型的原因.否则,self: Type看起来像一个简单的语句,一个表达式.例如:

class A
class B extends A {
  this: A
}
Run Code Online (Sandbox Code Playgroud)

这是有效的Scala代码,它没有自我类型.