在玩D 2.0时,我发现了以下问题:
范例1:
pure string[] run1()
{
string[] msg;
msg ~= "Test";
msg ~= "this.";
return msg;
}
这将编译并按预期方式工作。
当我尝试将字符串数组包装在一个类中时,我发现我无法正常工作:
class TestPure
{
string[] msg;
void addMsg( string s )
{
msg ~= s;
}
};
pure TestPure run2()
{
TestPure t = new TestPure();
t.addMsg("Test");
t.addMsg("this.");
return t;
}
由于addMsg函数不纯,因此无法编译此代码。我不能使该函数成为纯函数,因为它会更改TestPure对象。
我想念什么吗?还是这是一个限制?
确实会编译以下内容:
pure TestPure run3()
{
TestPure t = new TestPure();
t.msg ~= "Test";
t.msg ~= "this.";
return t;
}
〜=运算符不会被实现为msg数组的不纯函数吗?为何编译器不会在run1函数中提示呢?
最佳答案
从v2.050开始,D也放宽了pure
的定义,以接受所谓的“弱纯”函数。这指的是函数“do not read or write any global mutable state”。从功能语言的意义上来说,纯净函数的与纯净函数的不同。唯一的关系是,它们制作了真正的纯函数,也就是“强纯”函数,可以调用弱函数,例如OP的示例。
这样,由于只有局部变量addMsg
被更改,因此pure
可以标记为(弱)this.msg
:
class TestPure
{
string[] msg;
pure void addMsg( string s )
{
msg ~= s;
}
};
当然,现在您可以不加修改地使用(强烈)
pure
函数run2
。pure TestPure run2()
{
TestPure t = new TestPure();
t.addMsg("Test");
t.addMsg("this.");
return t;
}
关于d - 如何在D 2.0中使用pure,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1008803/