“=>”在自类型中的原因是什么?

14

自类型的示例如下:

trait A { self: String => }

这意味着特征A(或其子类型)必须继承类String

关键字self后面跟着:,类似于变量var s: String中类型在:后面的位置。

但是,在自类型中=>表示什么?这背后的原因是什么?


1
我认为这是一种奇怪的语法,因为它看起来像一个指向某个东西的箭头... - Dave L.
是的,在学习Scala的初期,我总是认为箭头指向函数体的其余部分,这让我感到非常困惑。 - John Threepwood
3个回答

11

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

那么应该选择哪个分隔符呢?你不想要嵌套的大括号,比如trait A { self: String { ... }}。那么哪些现有的非成对分隔符存在呢?我能想到的只有=>

=> 在其他地方用于哪里?作为函数类型的语法糖 (A => B) 和函数体 (i: Int => i + 1)。也用于按名称调用的参数以及模式匹配的情况。这种最后一种用法与自身类型有些连贯。就像将this与特定类型进行匹配,然后根据这个“匹配”来定义函数体。我不知道,也许这个类比有点傻。


谢谢您分享您对该主题的看法。我觉得很不错。我也有类似的想法。 - John Threepwood

10
请注意,self 不是关键字,而是普通标识符。您可以在 self 的位置上编写任何其他有效的标识符。在表达式后面添加 : 是一种类型注释,无论在表达式有效的任何地方都是完全有效的。 => 告诉 Scala 存在自身类型。否则,self: Type 看起来就像一个简单的语句或表达式。例如:
class A
class B extends A {
  this: A
}

这是有效的Scala代码,且没有自类型。


好的观点,谢谢。使用=>作为自类型符号的具体原因是什么,还是只是因为它与Scala语法的其他部分很搭配? - John Threepwood
@JohnThreepwood Odersky 不喜欢使用保留的符号和关键字,因此他尝试重用现有的符号。我认为他在下划线方面有些过分,但这就是现实。 - Daniel C. Sobral

0

this 在类的主体内部是可见的,所以从这个意义上说它是一个参数(尽管我们从来没有这样考虑过)。self-type 语法只是使其明确,并允许给它一个不同的名称(和类型)。因此,箭头成为将绑定器和其作用域分隔开的一个非常好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接