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

5
在许多现代语言中,应该使用 const 修饰符来澄清接口和意图,并为编译器提供一些优化机会。在 D 中,有一个非常酷的功能,可以实现真正的不可变数据。如何使用 const 和 immutable 呢?我想,将 const 作为函数参数的修饰符,将 immutable 用于本地变量似乎是编写代码的好方法,但是一旦您想要将带有引用或指针类成员(无论是私有还是公有)的结构体分配给不可变变量时,就无法做到这一点。
struct S {
    private int[] data;
}

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

因此,如果我使用不可变类型,更改struct的实现可能会破坏我的代码。在本地变量中应该使用const并仅在必要时使用不可变类型吗?有哪些指南?
1个回答

6
你非常幸运 - 上周发布了一段DConf2013的视频演示,专门介绍了这个主题:http://youtu.be/mPr2UspS0fE 在你的情况下,auto s = new immutable(S)(); 应该能解决问题。然后,您可以在构造函数中创建指向数据片段的指针。但是,如果此片段可能指向任何数据,则 S 不可能是不可变的,因为在 D 中,constimmutable 都是传递性的 - 它们不仅对变量本身提供非常强的保证,而且还对通过引用/指针间接访问的任何数据提供保证。
实际上,在链接的视频中已经涵盖了这一点,但简要概括一下,当您真正打算使用不可变时,您应该使用它。换句话说,当您希望您的代码在 S 实现更改以至于不可变保证不再有效时出现错误时,您应该使用不可变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接