在玩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/

10-13 05:30