2013-07-18 5 views
2

나는 여분 (another) : json 모듈뿐만 아니라 녹 (Rust)을 배우고 있습니다.는 역 참조를 벗어날 수 없습니다

$ rust run json.rs 
json.rs:70:9: 70:18 error: cannot move out of dereference of & pointer 
json.rs:70   &Object(o) => { 
        ^~~~~~~~~ 
note: in expansion of fmt! 
json.rs:68:10: 79:6 note: expansion site 
error: aborting due to previous error 

나는이 오류를 때리지 마세요 일치를 사용 other examples이 : 내가 컴파일 할 때

let j:Result<Json,JsonError> = from_str("[{\"bar\":\"baz\", \"biz\":123}]"); 
let l:List = match j { 
    Ok(List(l)) => l, 
    Ok(_) => fail!("Expected a list at the top level"), 
    Err(e) => fail!(fmt!("Error: %?", e)) 
}; 
println(fmt!("item = %?", l.iter().advance(|i|{ 
    match i { 
     &Object(o) => { 
      println(fmt!("Object is %?", o)); 
     }, 
     _ => { 
      fail!("Should be a list of objects, no?"); 
     } 
    } 
    println(fmt!("i=%?", i)); 
    true 
}))); 

, 나는이 얻을 : 여기에 (추가 unneeed 형 주석) 내 예입니다.

도움 주셔서 감사합니다.

답변

11

이와 같은 패턴은 기본적으로 일치하는 것으로부터 벗어나는 것을 의미하는 구조 변경입니다. 원하는 항목 :

&Object(ref o) => { ... } 

부재 밖으로 이동하지 않고 빌린 참조를 사용합니다.

+0

감사를 표시해야합니다. – Ozten

0

코리의 대답이 훨씬 낫습니다. 토론/완성을 위해 나는 그의 대답을 읽기 전에 내가 발견 한 것을 추가 할 것이라고 생각했다.

이 작업을 수행하여 & 제거 할 수 있습니다 : 당신은 JSON 객체를 복사하여 더 많은 메모리를 사용하기 때문에

let item:Json = copy *i; 
    match item { 
     Object(o) => { 
      println(fmt!("true = %?", o.contains_key(&~"bar"))); 
      //let barItem = ; 
      let baz = match copy *o.get(&~"bar") { 
       String(abaz) => abaz, 
       _ => fail!("Expected bar property") 
      }; 
      println(fmt!("bar = %?", baz)); 

그것의 ref 솔루션으로 좋지 않다.