gpt4 book ai didi

d - D 中唯一的不可变类

转载 作者:行者123 更新时间:2023-12-04 01:12:33 30 4
gpt4 key购买 nike

如何创建一个不可变的类?

我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immutable(mData) Data;并在任何地方使用它而不是类名。这很好用,但似乎没有必要。

如果我用不可变( immutable class Data{...} )标记类定义,那不符合类的使用。因此,如果我从另一个类或函数中使用它并调用不可变方法(它们都是),编译器会提示在可变对象上调用不可变方法,即使根据定义该类是不可变的!为了解决这个问题,我必须在任何地方的类型名称前面添加不可变关键字。这就是别名真正为我做的事情。

别名真的是最好的方法吗?
不可变关键字对类定义有什么作用?
如果它什么都不做,这不应该是某种警告或错误吗?

(在 Windows 8 上使用带有 dub 和 DMD32 D Compiler v2.066.0 的 Xamarin Studio)

最佳答案

我认为 alias 是最好的方法,再加上类外的不可变。后者的作用是:

http://dlang.org/class.html
如果 ClassDeclaration 具有 const、不可变或共享存储类,则就好像该类的每个成员都使用该存储类声明。如果基类是 const、不可变或共享的,则从它派生的所有类也是 const、不可变或共享的。

因此,它可以避免您在内部的所有内容上设置不可变,并且也适用于继承。但它不会改变类型本身 - Data仍然是一个可变引用,仅针对所有不可变数据(顺便说一句,它有时可能很有用,因为它可以很容易地重新绑定(bind)到另一个实例)。您的别名实现了类型的全部更改。

顺便说一句,还要向您的不可变类添加一个构造函数。即使它只是空的,不可变构造函数的存在(如果你把不可变的放在外面,那就是全部)将完全禁止可变构造:

immutable class Foo { }

Foo foo = new Foo(); // permitted. All the data will be immutable, but it will let you construct it this way

immutable class Foo {
this() {}
}

Foo foo = new Foo(); // Error: immutable method test100.Foo.this is not callable using a mutable object

那么你想用
auto foo = new immutable Foo(); // (infers based on right hand side)

你也可以这样写:
immutable foo = new immutable Foo(); // (infers always to an immutable type)

或者
immutable(Foo) foo = new immutable Foo(); // (explicitly writing the immutable type)

取决于你喜欢什么。

关于d - D 中唯一的不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337615/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com