自型看起来像以下示例:自我类型中`=>`背后的原因是什么?
trait A { self: String => }
这是说,该性状A
(或它的一个子类型)必须继承类String
。
关键字self
后跟:
类似物到一个变量中var s: String
,其中类型来:
之后。
但是=>
在自我类型中声明的是什么?这背后的原因是什么?
自型看起来像以下示例:自我类型中`=>`背后的原因是什么?
trait A { self: String => }
这是说,该性状A
(或它的一个子类型)必须继承类String
。
关键字self
后跟:
类似物到一个变量中var s: String
,其中类型来:
之后。
但是=>
在自我类型中声明的是什么?这背后的原因是什么?
只是猜测工作...你需要一些自我类型声明的特定分隔符。想象一下=>
只是被省略了。 this: String
将是一个语法上有效的语句(尽管类型检查器会投诉)。
那应该是哪个分隔符?你不会想要像trait A { self: String { ... }}
这样的嵌套花括号。那么存在哪些不配对的现有分隔符? =>
是我能想到的唯一一个。
=>
=>
在哪里?作为函数类型的糖(A => B
)和函数体(i: Int => i + 1
)。也适用于按名称参数以及模式匹配的情况。这最后一次使用与自我类型有点相关。这就像匹配this
是一个特定的类型,然后根据这个“匹配”来定义主体。我不知道,也许这是一个愚蠢的比喻。
感谢您分享您对该主题的看法。听起来不错。我尝试了一个类似的方向。 –
请注意,self
不是一个关键字,而是一个正常的标识符。你真的可以写任何其他有效的标识符代替self
。并且:
在表达式是类型归属之后,在表达式有效的任何地方都是完全有效的。
=>
是告诉斯卡拉有一个自我类型。否则,self: Type
看起来像一个简单的陈述,一个表达式。例如:
class A
class B extends A {
this: A
}
这是有效的Scala代码,它没有自我类型。
好点,谢谢。使用'=>'作为自我类型的符号还是仅仅是因为它符合Scalas语法的其余部分? –
@JohnThreepwood Odersky反对保留符号和关键字,因此他试图重复使用他拥有的符号和关键字。我认为,当谈到强调时他说得太过分了,但事实就是这样。 –
this
在一个类的主体内部,所以在这个意义上它是一个参数(尽管我们从来没有这样想过)。自我类型语法只是简单明了,并允许给它一个不同的名称(和类型)。所以箭头成为一个非常好的选择,作为活页夹与其范围之间的分隔符。
这是一个奇怪的位语法我认为,因为它看起来像一个箭头,将指向某些东西... – david
是的,在学习斯卡拉开始时,我总是认为箭头指向身体的其余部分,看起来像一个功能,让我很困惑。 –