10

一部の Scala APIはthisselfにエイリアスします。たとえば、

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 に対して何か違うことをする理由を説明しています。

N > 4 の FunctionN では、より多くのオブジェクトを動的に作成する代わりに、静的に作成されるクラスがはるかに少なくなります (このような関数が一般的である可能性が高いことを考えると、これは妥当と思われます)。これにより、ファイル名の長さの制限にぶつかることなく、N > 8 の FunctionN でカリーを使用することもできます。

于 2013-04-27T01:37:48.317 に答える