2017-05-22 1 views
0

P<SomeStruct> (소유 또는 변경 가능한 참조) 유형의 변수가있는 경우 새 포인터를 반환하지 않고 해당 구조체의 필드를 변경할 수 있습니까? 나는 이런 식으로 뭔가를하려고했는데 : 스마트 포인터 내에서 구조체의 필드를 변이 어떤 방법이 있나요포인터 내에서 struct의 필드를 변경하는 방법은 무엇입니까?

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

는 스마트 포인터 내에서 구조체의 필드를 변이 할 수있는 방법이 있습니까?

물론, 여기에 사용하는 예제 Box (playground)입니다 :

#[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를 얻을 수 있도록 내부 T, Box<T>는 [...]

더 구체적으로 달리 P<T>은하지 DerefMutDeref을 구현하지만 그것.

관련 문제