Sim*_*lex 1 containers immutability rust
下面,我的TestStruct实例包装在两个容器中: a Box,然后是 a Vec。从 Rust 新用户的角度来看,令人惊讶的是,将 移至Box使得Vec和Box实例TestStruct都可变。
struct TestStruct { value: i32 }
fn test_fn() {
let immutable_instance = TestStruct{value: 123};
let immutable_box = Box::new(immutable_instance);
let mut mutable_vector = vec!(immutable_box);
mutable_vector[0].value = 456;
}
Run Code Online (Sandbox Code Playgroud)
是否有类似的构造,其中装箱值是不可变的,但盒子的容器是可变的?更一般地说,是否可以拥有多个容器“层”,而整个树不可变或不可变?
是否有类似的构造,其中装箱值是不可变的,但盒子的容器是可变的?更一般地说,是否可以拥有多个容器“层”,而整个树不可变或不可变?
并不真地。您可以轻松地创建一个(只需创建一个实现Deref但不实现的包装对象DerefMut),但现实是 Rust 并没有真正以这种方式看到(im)可变性,因为它的主要关注点是控制共享/可见性。
毕竟,对于外部观察者来说,两者之间有什么区别?
mutable_vector[0].value = 456;
Run Code Online (Sandbox Code Playgroud)
和
mutable_vector[0] = Box::new(TestStruct{value: 456});
Run Code Online (Sandbox Code Playgroud)
?
没有答案,因为 Rust 的所有权系统意味着观察者不可能保留原始结构的句柄TestStruct,因此他们无法知道该结构是否被替换或修改[1] [2]。
如果您想保护内部状态,请改用可见性:https://play.rust-lang.org/?version =stable&mode=debug&edition=2021&gist=8a9346072b32cedcf2fccc0eeb9f55c5
mutable_vector[0].value = 456;
Run Code Online (Sandbox Code Playgroud)
无法编译,因为从 的角度来看test_fn,TestStruct::value是不可访问的。因此,除非您在其上添加方法,否则test_fn无法改变 a 。TestStruct&mut
[1]:从技术上讲,他们可以检查内存中的地址,这可能会告诉他们,但即使如此,这也不是确定的事情(在任一方向),因此固定是一件事。
[2]:这种可观察性的区别也被其他语言所接受,例如Clojure语言很大程度上属于“所有事物都是不可变的”方面,但是它有一个允许局部可变对象的瞬态概念
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |