pure
pure
TDPL が説明するように、単純な数学関数などを超えて有用であるにはあまりにも制限的であることが判明したため、TDPL のリリース以降、少し拡張されました。現在の定義についてはオンライン ドキュメントを参照できますが、基本的には次のようになります。
pure
関数は、プログラムの過程で変更できるモジュールレベルまたは静的変数にアクセスできません (それらはconst
値型であるかimmutable
、関数からアクセスする必要がありpure
ます)。
pure
関数は、そうでない関数を呼び出すことはできませんpure
。
pure
関数は I/O を実行できません。
それでおしまい。その他の制限はありません。ただし、関数がステートメント内で複数回使用されても 1 回だけ呼び出されるように関数を最適化する場合は、追加の制限が必要です。pure
すなわち:
- 関数のパラメーターは、
immutable
または暗黙的に に変換可能でなければなりませんimmutable
。
理論的には、関数の引数がimmutable
暗黙的に変換可能である必要があることを要求するように拡張できますimmutable
(引数が指定されたときにパラメーターを持つ関数をconst
最適化できるようにするためimmutable
) が、現在はそうではありません。
このようなpure
関数は "strongly" と呼ばれるpure
ことがありますが、最適化できない関数は "weakly" と呼ばれpure
ます。TDPL はpure
機能を強力に記述します。より一般的に使用できるpure
ようにするために、weakly関数が追加されました。pure
弱いpure
関数は引数を変更できますが、グローバル状態を変更することはできません。そのため、強力pure
な関数 (引数を変更できないpure
) によって呼び出された場合、強力な関数の戻り値が常に同じであることを保証します。引数はまだ保持されます。基本的に、weaklypure
関数はグローバル状態を変更できないため、pure
呼び出し元の strong 関数のプライベート状態の一部になります。したがって、関数のプライベート状態が拡張され、グローバル状態を変更せずにプライベート状態を変更できる関数を許可することを除いて、 Andrei がセクション5.11.1.1pure
でpure
説明していることと非常に一致しています。
TDPL に関して追加されたもう 1 つの重要な点pure
は、関数属性の推論です。pure
、nothrow
、および@safe
は、テンプレート化された関数に対して推論されます (通常の関数に対してではありません)。したがって、テンプレート化された関数がである場合pure
、現在は です pure
。その純度は、インスタンス化されたものによって異なります。これで、pure
テンプレート化された関数で使用できるようになりましたが、以前は通常使用できませんでしたpure
。でも作らないpure
と関数で使えないpure
ので大問題でした。pure
. 幸いなことに、属性の推論によって修正されるようになりました。テンプレート化された関数がインスタンス化時に上記のルールに従っている限り、それは と見なされpure
ます。