某些Scala API将此别名为 self ,例如,
trait Function1[-T1, +R] extends AnyRef { self =>
我知道这个别名是如何工作的,但是不知道如Function1这样的特性是如何从中受益的。除了最初的提及,Function1在其定义中的任何地方都不使用 self ,那么它的用途是什么?
之前已经询问过这个问题的变体,但答案并不直接适用。答案已经讨论了自我类型和内部类别,但我不知道这在哪里适用。
答案 0 :(得分:10)
请参阅https://github.com/scala/scala/blob/2.10.1/src/library/scala/Function1.scala#L8所在的位置
// GENERATED CODE: DO NOT EDIT. See scala.Function0 for timestamp.
代码由Function0
到Function22
的相同生成器生成。不知怎的,当它转到Function5
时,你开始看到self
被使用:
self.apply(x1, x2, x3, x4, x5)).curried
所以我怀疑让self =>
总是包含在生成器模板中会更容易。
以下是添加自引用的commit。提交消息实际上解释了为什么它为n> = 5做了不同的事情,我引用:
功能N,其中N> 4,静态创建的类很少 动态创建更多对象的费用(这似乎是合理的 鉴于这些功能可能是多么常见)。这也允许 功能N中的咖喱用于N> 8没有进入文件名长度 限制。