Подтвердить что ты не робот

Смещение этого в scala с помощью self =>

Некоторые API-интерфейсы Scala аналогичны этому, например,

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

Я знаю, как это сглаживание работает вообще, но не вижу, как от этого выигрывают такие функции, как Function1. Функция1 не использует self нигде в своем определении, кроме первоначального упоминания, поэтому в чем его цель?

Варианты этого вопроса заданы ранее, но ответы прямо не применимы. Ответы обсуждались самими типами и внутренними классами, но я не вижу, как это применимо здесь.

4b9b3361

Ответ 1

Смотрите 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, который добавляет самооценку. Сообщение commit на самом деле объясняет, почему он делает что-то другое при n >= 5, я цитирую:

ФункцияN, где N > 4, много меньше классов создаются статически на за счет создания большего количества объектов динамически (что кажется разумным учитывая, насколько распространены такие функции, вероятно, будут). Это также позволяет curry в FunctionN для N > 8 без пробега в длину имени файла ограничение.