在 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. 有更深层次的原因
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 模块确实维护了一些缓存,并对其进行了变异。