gpt4 book ai didi

immutability - 如何强制结构的字段在 Rust 中始终是不可变的?

转载 作者:行者123 更新时间:2023-12-03 11:46:31 25 4
gpt4 key购买 nike

在 Rust 中,您无需在 struct 中指定可变性。 ,但它是从变量绑定(bind)继承的。这很好,但是否可以强制字段始终不可变,即使根是可变的?

像这样的假设语法:

struct A {
immut s: Shape, // immutable by design
bla: Bla, // this field inheriting (im)mutability
}
let mut a = make_a();
a.s = x/*...*/; // illegal

这将有助于在程序中保持良好的语义限制,就像 Java 的 final 一样。确实(以非常有限的方式)。

此外,我们可以想象这种 struct对内部不可变数据有一些非拥有引用,利用这种不变性......

最佳答案

单个字段的不变性是不可能的。这是古代 version of Rust 中的一个选项。 (在 0.8 之前考虑),但由于规则混淆了很多人,它被放弃了。你可能会问,它是如何令人困惑的?可以这样想:如果一个字段被声明为可变的并且结构被声明为可变的并且使用的引用是一个不可变引用( & )那么该字段是 _______ .

最好的,如 Lily Ballard noted , 是你可以声明你的Shape字段为私有(private)并使用 impl A {...} 创建一个 getter 方法.

mod inner {
pub struct A {
s: i32, // can't be seen outside of module
pub bla: i32,
}

impl A {
pub fn new() -> Self {
Self { s: 0, bla: 42 }
}

pub fn get_s(&self) -> i32 {
self.s
}
}
}
let mut a = inner::A::new();
a.s = 42; // illegal
println!("{}", a.s); // also illegal
println!("{}", a.get_s()); // could be made to serve as a read-only method

error[E0616]: field `s` of struct `main::inner::A` is private
--> src/main.rs:20:5
|
20 | a.s = 42; // illegal
| ^^^

error[E0616]: field `s` of struct `main::inner::A` is private
--> src/main.rs:21:20
|
21 | println!("{}", a.s); // also illegal
| ^^^

有一个命题可能会完全放弃可变性和不变性的概念(你不能说结构永远不会改变)。见 Niko's explanation为了那个改变。

关于immutability - 如何强制结构的字段在 Rust 中始终是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66362613/

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