在玩D 2.0时,我发现了以下问题:
例1:
pure string[] run1()
{
string[] msg;
msg ~= "Test";
msg ~= "this.";
return msg;
}
Run Code Online (Sandbox Code Playgroud)
这编译并按预期工作.
当我尝试将字符串数组包装在一个类中时,我发现我无法使其工作:
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;
}
Run Code Online (Sandbox Code Playgroud)
此代码将无法编译,因为addMsg函数不纯.我不能使该函数纯,因为它改变了TestPure对象.我错过了什么吗?或者这是一个限制?
以下编译:
pure TestPure run3()
{
TestPure t = new TestPure();
t.msg ~= "Test";
t.msg ~= "this.";
return t;
}
Run Code Online (Sandbox Code Playgroud)
〜=运算符是否会被实现为msg数组的不纯函数?为什么编译器不会在run1函数中抱怨它?
从v2.050开始,D放宽了pure接受所谓的"弱纯"函数的定义.这指的是" 不读取或写入任何全局可变状态 "的函数.弱纯函数是不一样的,如功能性语感纯函数.唯一的关系是他们创造了真正的纯函数,也就是说"强纯"函数能够称之为弱函数,就像OP的例子.
有了这个,addMsg 可以标记为(弱)pure,因为只有局部变量this.msg被改变:
class TestPure
{
string[] msg;
pure void addMsg( string s )
{
msg ~= s;
}
};
Run Code Online (Sandbox Code Playgroud)
当然,现在您可以使用(强)pure功能run2而无需修改.
pure TestPure run2()
{
TestPure t = new TestPure();
t.addMsg("Test");
t.addMsg("this.");
return t;
}
Run Code Online (Sandbox Code Playgroud)