2

D では std.regex.regex() は純粋ではありません:

import std.regex;

pure void test() // test.d(5): Error: pure function 'test' cannot call impure function 'regex'
{
    auto r = regex(r"patern123", "g");
}

なんで?

それは...ですか

A. 十分なpureキーワードが投入されていません。

また

B. もっと深い理由がある

4

1 に答える 1

3

std.regexはモジュールであるため、純粋としてマークすることはできません。

Aへの回答: マーク機能pureは純粋ではありません。それはあなたがそれを純粋にしたいことをコンパイラーに伝えるだけであり、関数が本当に純粋にされることができればそれは仕事をします。純粋にできない場合、コンパイラはエラーを発生させます。これがここに当てはまります-test()は純粋でstd.regex.regex()ないため、純粋にすることはできません。経験則-純粋関数は不純な関数を呼び出すことはできません。

Bへの回答: はい、もっと深い理由があります。おそらくあなたはすでにそれらを知っていると思います。注意として、 http://en.wikipedia.org/wiki/Pure_functionを読んで、関数test()がこれら2つの主要なルールを満たしているかどうかを自問してください。このためには、当然、std.regex.regex()関数のセマンティクスを理解する必要があります。

おそらくあなたは質問したかったのでしょうなぜstd.regex.regex()は純粋ではないのですか? マットはすでにその質問に答えたと思います。--std.regexモジュールは確かにいくつかのキャッシュを維持し、それを変更します。

于 2013-02-18T10:46:19.637 に答える