2013-02-17 47 views
2

在d std.regex.regex()不是纯: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.存在着一些深层次的原因

+7

也许这是由于'std.regex'做了一些缓存的事实。 – Mat 2013-02-17 11:50:45

+0

@Mat这是一个答案或只是一个普遍的想法/猜测? (“也许”可能是讽刺的标志,但我不确定) – dnsmkl 2013-02-17 15:00:58

+0

我不知道D及其“纯度”的定义。所以这是一个猜测。根本不是讽刺,如果听起来那么抱歉。 – Mat 2013-02-17 15:01:51

回答

3

std.regex被抛出是一个模块,这样就不能标记为纯。

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

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

也许您想问问为什么std.regex.regex()不纯? 垫子已经回答了我认为的问题。 - std.regex模块确实保留了一些缓存,并对它进行了变异。

+1

您对答案A的误解是误导性的,因为它意味着将函数标记为“纯”是一个建议。不是。如果函数不能是'pure',并且它被标记为'pure',那么你会得到一个错误。 – 2013-02-18 20:14:05

+0

@DejanLekic我在名字中犯了错误。问题应该是“为什么是std.regex.regex()” – dnsmkl 2013-02-18 20:29:53

+0

@JonathanMDavis - 好点。我认为从我写的很明显,编译器会“喊”...... :)我添加了一个关于编译错误的句子,使其更加清晰。 – DejanLekic 2013-02-19 08:34:36

相关问题