【问题标题】:d2: immutability of partially known structuresd2:部分已知结构的不变性
【发布时间】:2012-04-08 21:17:24
【问题描述】:

在 D 中,immutable 是可传递的,因此禁止对不可变结构的任何字段赋值。据我了解,强烈保证不可变结构变量永远不会改变,它的所有内容也是如此。

但是如果我声明了这样的事情呢?

struct OpaqueData;
immutable(OpaqueData*) data;

D 如何保证未在 D 中实现且可能具有间接性的结构的传递不变性?

将这种指向不透明数据的指针封装在不可变类中的正确方法是什么?

【问题讨论】:

    标签: immutability d


    【解决方案1】:

    由于您不知道OpaqueData 中的任何字段,因此您一开始就不能分配给它的任何内容。

    当然,您可以通过抛弃 immutable(D 确实赋予您这样做的能力)并为原始内存分配一个 OpaqueData* 值指向的值来完全破坏类型系统,但是您询问您最终会遇到的任何问题...如果您不这样做并且尊重您的OpaqueData 指针是immutable,由于类型限定符的传递性,您不能以任何方式更改它。

    事实上,这就是它们的全部意义:它们在数学上是合理的。

    【讨论】:

    • 好吧,你是对的。我想到了 D 范围的 D 保证 out - 当不可变结构指针传递给 C 函数时。事实上这是不可能的,至少因为immutable 应该在将不可变结构指针传递给 C 函数之前被丢弃,从而破坏类型系统。谢谢你帮我解决这个问题。
    • 是的。由于 C 拥有的最强的是 const,而 C 可以抛弃它,如果您将 immutable 数据传递给 C 函数(实际上与 const 相同,因为在 D 中改变 const 数据同样非法——只是对该数据的其他引用仍然可以改变它)。如果 C 函数实际上将其视为const,那么你很好,但如果不是,你就会遇到问题。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2010-11-06
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多