何时以及如何在D中使用`const`和`immutable`?

时间:2013-05-15 08:32:18

标签: d immutability const-correctness

在许多现代语言const中,应使用正确性来阐明接口和意图,并为编译器提供一些优化机会。在D中,存在真正不可变数据的很酷的特征。应该如何使用constimmutable?我有点想,更喜欢const作为函数参数的限定符,而immutable作为局部变量似乎是编写代码的好方法,但是只要你想为结构赋予引用或指针像数据成员(私有或非私有)到不可变变量,你不能这样做。

struct S {
    private int[] data;
}

void main() {
    immutable s = new S; // won't work, since members aren't immutable
}

因此,如果我使用不可变的话,更改struct的实现可能会破坏我的代码。我是否应该更喜欢const用于局部变量并且仅在必要时使用不可变?准则是什么?

1 个答案:

答案 0 :(得分:6)

你非常幸运 - 上周发布了一篇来自DConf2013的视频,该视频专门针对这一主题进行了演示:http://youtu.be/mPr2UspS0fE

在您的情况下,auto s = new immutable(S)();应该可以解决问题。然后,您可以在构造函数中创建数据切片点。但是,如果此切片可能指向任何数据,则S不可能是不可变的,因为constimmutable在D中都是可传递的 - 它们提供了非常强大的保证不仅关于变量本身,还关于可以通过引用/指针间接访问的任何数据。

它实际上涵盖在链接视频中,但简短的总结是你想在真正打算使用不可变时。换句话说,当您想要时,如果S实施发生变化,您的代码就会中断,以便不可变保证不再有效。