如果我有一个P<SomeStruct>
类型的变量(拥有或者是一个可变引用),是否可以在该结构上改变一个字段而不返回一个新指针?我一直在尝试这样的事情:
#![feature(rustc_private)]
extern crate syntax;
use syntax::ptr::P;
#[derive(Debug)]
struct Baz {
id: String,
}
#[test]
fn foo() {
let mut pointer = P(Baz { id: "blah".to_string() });
bar(&mut pointer);
}
fn bar(x: &mut P<Baz>) {
x.id = "bing".to_string()
}
但当然失败了:
error: cannot assign to immutable field
--> src/lib.rs:116:5
|
116 | x.id = "bing".to_string()
| ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot mutably borrow immutable field
有没有办法在智能指针中改变结构上的字段?
游乐场网址:https://play.rust-lang.org/?gist=5675bc2ef4297fe691204a69ffc19461&version=nightly&backtrace=0
答案 0 :(得分:4)
有没有办法在智能指针中改变结构上的字段?
当然,这是使用composer dump-autoload
(playground)的示例:
Box
但您似乎是尝试使用#[derive(Debug)]
struct Baz {
id: String,
}
#[test]
fn foo() {
let mut pointer = Box::new(Baz { id: "blah".to_string() });
bar(&mut pointer);
}
fn bar(x: &mut Box<Baz>) {
x.id = "bing".to_string()
}
来做到这一点,syntax::ptr::P
自我描述为frozen owned smart pointer:
- 不变性:
P<T>
不允许改变其内部T
,与Box<T>
不同[...]
更具体地说,P<T>
实现了Deref
,而不是DerefMut
,因此您无法通过解除引用来获得&mut T
&mut P<T>
它