2012-06-30 46 views
12

自型看起来像以下示例:自我类型中`=>`背后的原因是什么?

trait A { self: String => } 

这是说,该性状A(或它的一个子类型)必须继承类String

关键字self后跟:类似物到一个变量中var s: String,其中类型来:之后。

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

+1

这是一个奇怪的位语法我认为,因为它看起来像一个箭头,将指向某些东西... – david

+0

是的,在学习斯卡拉开始时,我总是认为箭头指向身体的其余部分,看起来像一个功能,让我很困惑。 –

回答

11

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

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

=>=>在哪里?作为函数类型的糖(A => B)和函数体(i: Int => i + 1)。也适用于按名称参数以及模式匹配的情况。这最后一次使用与自我类型有点相关。这就像匹配this是一个特定的类型,然后根据这个“匹配”来定义主体。我不知道,也许这是一个愚蠢的比喻。

+0

感谢您分享您对该主题的看法。听起来不错。我尝试了一个类似的方向。 –

9

请注意,self不是一个关键字,而是一个正常的标识符。你真的可以写任何其他有效的标识符代替self。并且:在表达式是类型归属之后,在表达式有效的任何地方都是完全有效的。

=>是告诉斯卡拉有一个自我类型。否则,self: Type看起来像一个简单的陈述,一个表达式。例如:

class A 
class B extends A { 
    this: A 
} 

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

+0

好点,谢谢。使用'=>'作为自我类型的符号还是仅仅是因为它符合Scalas语法的其余部分? –

+0

@JohnThreepwood Odersky反对保留符号和关键字,因此他试图重复使用他拥有的符号和关键字。我认为,当谈到强调时他说得太过分了,但事实就是这样。 –

0

this在一个类的主体内部,所以在这个意义上它是一个参数(尽管我们从来没有这样想过)。自我类型语法只是简单明了,并允许给它一个不同的名称(和类型)。所以箭头成为一个非常好的选择,作为活页夹与其范围之间的分隔符。

相关问题