如何在指针中改变struct中的字段?

时间:2017-05-22 16:16:49

标签: pointers struct rust

如果我有一个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

1 个答案:

答案 0 :(得分:4)

  

有没有办法在智能指针中改变结构上的字段?

当然,这是使用composer dump-autoloadplayground)的示例:

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>