如何在D 2.0中使用pure

Jer*_*rks 10 d pure-function

在玩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函数中抱怨它?

ken*_*ytm 6

从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)