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() 不能是 pure 因为std.regex.regex()is not pure。经验法则 - 纯函数不能调用不纯函数。

对B的回答: 是的,还有更深层次的原因,我相信你可能已经意识到了。作为提醒,请阅读http://en.wikipedia.org/wiki/Pure_function并问问自己您的函数是否test()满足这两个主要规则?为此,自然需要了解 std.regex.regex() 函数的语义......

也许你想问为什么 std.regex.regex() 不纯? 我认为马特已经回答了这个问题。- std.regex 模块确实维护了一些缓存,并对其进行了变异。

于 2013-02-18T10:46:19.637 回答