我试图了解 Rust 指针类型及其与可变性的关系。具体来说,声明一个保存指针且本身可变的变量的方法——即可以指向其他内存,并声明该变量数据本身是可变的——即可以改变through指针变量的值。
这就是我对简单引用工作方式的理解:
let mut a = &5; // a is a mutable pointer to immutable data
let b = &mut 5; // b is an immutable pointer to mutable data
So a
可以更改为指向其他内容,同时b
不能。然而,其中的数据b
点 to 可以通过更改b
,虽然无法通过a
. 我的理解正确吗?
对于问题的第二部分——为什么Box::new
似乎表现不同?这是我目前的理解:
let mut a = Box::new(5); // a is a mutable pointer to mutable data
let c = Box::new(7); // c is an immutable pointer to immutable data
new
应该返回一个指向某些堆分配数据的指针,但它指向的数据似乎从保存指针的变量继承了可变性,这与引用的示例不同,其中这两种可变性状态是独立的!是这样吗Box::new
应该可以工作吗?如果是这样,如何创建指向堆上存储在不可变变量中的可变数据的指针值?
首先,您确实了解引用如何正确运行。mut a
是一个可变变量(或者,更准确地说,是一个可变绑定),而&mut 5
是指向可变数据块的可变引用(它是在堆栈上隐式分配给您的)。
Second, Box
其行为与引用不同,因为它是根本不同来自参考文献。另一个名字为Box
is 拥有/拥有的指针. Each Box
owns它保存的数据,并且它这样做uniquely,因此该数据的可变性继承自盒子本身的可变性。所以是的,这正是如何Box
应该管用。
另一种可能更实用的理解方法是考虑Box<T>
完全相当于T
,除了固定大小和分配方法。换句话说,Box
提供值语义:它像任何值一样移动,其可变性取决于它存储的绑定。
有多种方法可以创建指向堆上可变数据的指针,同时保持指针不可变。最通用的是RefCell
:
use std::cell::RefCell;
struct X { id: u32 }
let x: Box<RefCell<X>> = Box::new(RefCell::new(X { id: 0 }));
x.borrow_mut().id = 1;
或者,您可以使用Cell
(for Copy
types):
let x: Box<Cell<u32>> = Box::new(Cell::new(0));
x.set(1);
请注意,上面的示例使用了所谓的“内部可变性”,最好避免这种情况,除非您do需要它来做某事。如果你想创建一个Box
使用可变内部只是为了保持可变属性,你真的不应该这样做。它不是惯用的,只会导致语法和语义负担。
您可以在这里找到很多有用的信息:
- 所有权 http://doc.rust-lang.org/book/ownership.html
- 参考文献和借用 http://doc.rust-lang.org/book/references-and-borrowing.html
- 可变性 http://doc.rust-lang.org/book/mutability.html
-
标准::细胞 http://doc.rust-lang.org/std/cell/- 内部可变类型
事实上,如果您对可变性等基本问题有疑问,书中可能已经对此进行了解释:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)