2014-10-04 3 views
0

나는 녹슬지 않는 이진 트리를 쓰려고하는데 매번 복사 할 필요없이 procs 사이를 지나칠 수 있습니다. 평생 동안 생기는 녹의 제한으로 어떻게하는지 이해하는 데 어려움을 겪고 있습니다. 다음은 나를 error: 'l' does not live long enough, 그리고 error: 'r' does not live long enough입니다."녹지 않아도 오래 살아남지 못합니다"

#[deriving(Show)] 
struct node<'a> { 
    left: &'a int, 
    right: &'a int 
} 

let l = 3; 
let r = 4; 
let n = node { 
    left: &l, 
    right: &r 
}; 

spawn(proc() { 
    println!("{}", n); 
}); 

필자는 왜 그들이 오래 살지 않는다고 생각하는지 이해하지만 어떻게 구조 조정해야합니까? 어떤 도움을 크게 환영합니다

답변

2

상황에 따라 main() 함수에서 정의한 변수에 대한 참조가있는 노드 객체를 만들고이를 새 작업으로 전달합니다. 문제는 다음과 같습니다. main() 작업 전에이 작업이 완료된다는 보장이 전혀 없으므로 원래 변수가 참조 이전에 범위를 벗어날 수 있으므로 오류가 발생합니다.

는 나무를 구축하고자하는 감안할 때, 나는 가장 쉬운 수정 같이, 당신의 Node 클래스가 필드를 소유해야하는 것입니다 생각 :

#[deriving(Show)] 
struct Node { 
    left: int, 
    right: int 
} 

그런 다음 더 이상 liftetime 문제가 발생하지 않습니다.

그런 다음 복사하지 않고 여러 작업간에 공유하려면 std::sync::Arc 래퍼를 사용할 수 있습니다. 바로 그 기능입니다. 당신이뿐만 아니라 Node에 다른 작업 쓰기 액세스 권한을 부여해야 할 경우 당신은 아마 Arc 내부 전체를 유지하는 Mutex 또는 RWlock에 포장 할 것,

use std::sync::Arc; 

fn main() { 

    let n = Arc::new(Node { 
     left: 3, 
     right: 4 
    }); 

    for _ in range(0u, 10) { 
     let n_proc = n.clone(); 
     spawn(proc() { 
      println!("{}", *n_proc); 
     }); 
    } 
} 

: 당신은 뭔가를 할 수 있습니다.