【问题标题】:Combining immutable and normal constructor in D?在D中结合不可变和普通构造函数?
【发布时间】:2014-01-05 19:34:02
【问题描述】:

是否可以编写一个构造函数而不是两个构造函数,并且仍然能够创建普通对象和不可变对象?编写普通构造函数和不可变构造函数都是很多重复的工作。

class ExampleClass
{
    void print() const
    {
        writeln(i);
    }

    this(int n)
    {
        i = n * 5;
    }

    this(int n) immutable
    {
        i = n * 5;
    }

private:
    int i;
}

【问题讨论】:

    标签: d immutability


    【解决方案1】:

    使构造函数pure 可以隐式转换为任何限定符。

    this(int n) pure
    {
        i = n * 5;
    }
    
    auto i = new immutable ExampleClass(2);
    auto m = new ExampleClass(3);
    

    在此处记录: http://dlang.org/class.html "如果构造函数可以创建唯一对象(例如,如果它是纯对象),则该对象可以隐式转换为任何限定符。"

    顺便说一句:其他纯函数的返回值也隐式转换。

    // returns mutable...
    char[] cool() pure {
        return ['c', 'o', 'o', 'l'];
    }
    
    void main() {
        char[] c = cool(); // so this obviously works
        string i = cool(); // but since it is pure, this works too
    }
    

    那里的工作原理相同,它是独一无二的,因此也可以假定它是共享的或不可变的。

    【讨论】:

    • 你说得对,这适用于示例案例。但是,在我的实际使用案例中,我必须调用 glCreateShader 之类的不纯函数,因此您的解决方案不起作用。 ://
    • @Scintillo 在这种情况下,您实际上是在创建一个不可变对象吗?听起来它允许突变,在这种情况下,您可以简单地禁止创建它的不可变实例。
    • @Cubic 确实可以使对象发生变异,因为 OpenGL 并不允许您使资源不可变。不可变只会阻止更改资源 id 包装指向并成为“请不要修改此对象”的准则。
    • 关于聊天的快速想法是否奏效:创建一个从可变和不可变 ctor 调用的 const 助手?
    • @AdamD.Ruppe 当然你不能写给 const 函数中的成员。但是,如果像这样调用i = helper(n);,它可以删除大部分重复的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多