2017-05-22 11 views
0

タイプがP<SomeStruct>(所有または変更可能な参照)の変数を持つ場合、新しいポインタを返さずに、その構造体のフィールドを変更することは可能ですか?私はこのような何かをしようとしてきた:スマートポインタ内構造体のフィールドを変異させるためにどのような方法がありますポインタ内の構造体のフィールドを変更するには?

error: cannot assign to immutable field 
    --> src/lib.rs:116:5 
    | 
116 |  x.id = "bing".to_string() 
    |  ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot mutably borrow immutable field 

#![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() 
} 

が、失敗すると当然の

遊び場のURL:https://play.rust-lang.org/?gist=5675bc2ef4297fe691204a69ffc19461&version=nightly&backtrace=0

+1

これは再現できません。この正確なコンパイルエラーを示す例を[Rust Playground](https://play.rust-lang.org)に書き込むことを検討してください。 –

+0

@ E_net4、必要なインポートと機能のフラグ、および錆のプレイグラウンドへのリンクを追加しました。 –

答えて

4

はスマートポインタ内構造体のフィールドを変異する方法はありますか?

確かに、ここBoxplayground)を使用した例です:

#[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() 
} 

しかし、あなたがfrozen owned smart pointerとして自己記述syntax::ptr::P、とのことをやろうとしているように見える:

  • 不変性P<T>突然変異あなたはそれを逆参照することにより&mut P<T>のうち&mut Tを取得することはできませんのでインナーTBox<T>は[...]

は、具体的には異なり、P<T>は、ないDerefMutDerefを実装していますが、その。

関連する問題