10

一些 Scala API将其别名为self,例如,

trait Function1[-T1, +R] extends AnyRef { self =>

我知道这种别名一般是如何工作的,但看不到诸如 Function1 之类的特征如何从中受益。除了最初的提及外, Function1 在其定义中的任何地方都没有使用self,那么它的目的是什么?

这个问题的变体以前已经问过,但答案并不直接适用。答案已经讨论了自我类型和内部类,但我不明白这在这里如何应用。

4

1 回答 1

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.

代码由相同的生成器生成Function0through Function22。不知何故,当Function5你开始看到self被使用时:

self.apply(x1, x2, x3, x4, x5)).curried

self =>所以我怀疑总是包含在生成器模板中更容易。

这是添加自我引用的提交。提交消息实际上解释了为什么它对 n >= 5 做不同的事情,我引用:

FunctionN,其中 N > 4,以动态创建更多对象为代价,静态创建的类更少(考虑到此类函数的常见程度,这似乎是合理的)。这也允许在 FunctionN 中对 N > 8 进行 curry,而不会遇到文件名长度限制。

于 2013-04-27T01:37:48.317 回答