std.regex.regex()不是纯的。为什么?

std.regex.regex()不是纯的。为什么?,d,phobos,D,Phobos,在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.没有足够的纯关键字 或 B.存在一些更深层次的原因std.regex是一个模块,因此不能将其标记为纯 回答A:

在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.没有足够的
关键字


B.存在一些更深层次的原因

std.regex
是一个模块,因此不能将其标记为纯

回答A: 将函数标记为纯函数
不会使其成为纯函数。它只是告诉编译器,您希望它是纯的,如果函数确实可以成为纯的,它将完成这项工作。如果它不能是纯的,编译器将引发一个错误。这里就是这种情况-test()不能是纯的,因为
std.regex.regex()
不是纯的。经验法则-纯函数不能调用不纯函数

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

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

这可能是因为
std.regex
进行了一些缓存。@Mat这是一个答案还是一个普遍的想法/猜测?(“也许”可能是讽刺的标志,但我不确定)我不知道D和它对“纯洁”的定义。所以这是一个猜测。这根本不是讽刺,如果听起来像这样,很抱歉。@dnsmkl您可以自己拿a。您对a的回答是误导性的,因为这意味着将函数标记为纯
是一种建议。不是。如果函数不能是
纯的
,并且它被标记为
纯的
,那么您将得到一个错误。@DejanLekic我在名称上犯了错误。问题应该是“为什么std.regex.regex()”@JonathanMDavis——这一点很好。我认为,从我写的内容来看,编译器显然会“大喊”…)我添加了一个关于编译错误的句子,以使其更清楚。