2017-01-27 4 views
0

Holded 인스턴스를 유지하고 싶지만 어레이에 있기 때문에 그럴 수 없습니다. 배열에서이 인스턴스를 '추출'하고 Object 인스턴스에 보관하려면 어떻게합니까? (원래 코드에서는 배열이 아니라 반복자가 없습니다.)`array`가 충분히 길지 않습니다

struct Holded { 
    value: u8, 
} 

struct Holder; 

impl Holder { 
    pub fn get(&self) -> [Holded; 2] { 
     [Holded { value: 0 }, Holded { value: 1 }] 
    } 
} 

struct Object<'a> { 
    holded: &'a Holded, 
} 

fn main() { 
    let holder = Holder; 

    let obj = work(&holder).unwrap(); 
    println!("{}", obj.holded.value); 
} 

fn work(holder: &Holder) -> Option<Object> { 
    let mut obj: Object; 
    let array = holder.get(); 

    for h in array.into_iter() { 
     if h.value == 1u8 { 
      obj = Object { holded: h }; 
      return Some(obj); 
     } 
    } 

    None 
} 

오류 메시지 :

struct Object<'a> { 
    holded: &'a Holded, 
} 

기능에서 : 당신이 게시 한 MCVE에서

error: `array` does not live long enough 
    --> src/main.rs:28:14 
    | 
28 |  for h in array.into_iter() { 
    |    ^^^^^ does not live long enough 
... 
36 | } 
    | - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 24:43... 
    --> src/main.rs:24:44 
    | 
24 | fn work(holder: &Holder) -> Option<Object> { 
    |           ^
+1

[동일한 오류 메시지와 질문 ** 87 **는 (있다 http://stackoverflow.com/search?q=is%3Aq+Cannot+infer+an+appropriate+lifetime+due+to+conflicting + 요구 사항). 어쩌면 시간을내어 그 중 일부를 복습하고 *이 질문이 왜 특별하고 다르고 아직 답을 얻지 못했는지 설명 할 수 있습니다. – Shepmaster

+0

나는 그들 중 많은 것을 이미 보았지만 문제는 대부분 조용하다. _why_ 나는이 오류를 가지고 있으며, 다른 게시물을 보는 것이 이것에 도움이되지 않는다. –

+0

나는 또한 그것들 중 많은 것을 보았고 그 문제는 하나에 설명되어있다. - 기존 질문 중 * *에 * 잘못된 점을 지적하지 않을 때 얼마나 유용합니까? 당신이 무엇이 잘못되었는지 우리에게 말하지 않으면, 우리는 당신이 이미 이해하지 못했던 동일한 대답을 반복 할 것이고, 당신은 도움을받지 못할 것이며, 더 나쁜 경우에는 다음 사람이하지 않을 대답이 하나 더있을 것입니다. 읽고 대신 코드를 수정하도록 요청하고 무시하십시오. – Shepmaster

답변

0

는, 구조체 ObjectHolded에 대한 참조를 포함 여기에 해당하는 코드는 work()Object (선택 사항) :

fn work(holder: &Holder) -> Option<Object> { 

당신은 값을 반환하는 함수에서 Holded을 획득 :

impl Holder { 
    pub fn get(&self) -> [Holded; 2] { 
     [Holded { value: 0 }, Holded { value: 1 }] 
    } 
} 

지금이 작동하지 않습니다. Holded에 대한 참조를 반환하는 경우 참조하려는 Holded은 어딘가에 저장해야합니다. 이는 입력 또는 함수 work()의 출력으로 의미합니다.

Holder 안에 포함하도록 예제를 다시 작성했습니다. 이것이이를 해결하는 한 가지 방법입니다. 그러나 이것이 당신의 원래 문제에 적용될 지 확신하지 못합니다.

struct Holded { 
    value: u8, 
} 

struct Holder{ 
    value: [Holded; 2], 
} 

impl Holder { 
    pub fn new() -> Holder { 
     Holder {value: [Holded { value: 0 }, Holded { value: 1 }] } 
    } 

    pub fn get(&self) -> &[Holded; 2] { 
     &self.value 
    } 
} 

struct Object<'a> { 
    holded: &'a Holded, 
} 

fn main() { 
    let holder = Holder::new(); 

    let obj = work(&holder).unwrap(); 
    println!("{}", obj.holded.value); 

    let obj = work2(&holder).unwrap(); 
    println!("{}", obj.holded.value); 
} 

fn work(holder: &Holder) -> Option<Object> { 
    let obj: Object; 
    let array = holder.get(); 

    for h in array.into_iter() { 
     if h.value == 1u8 { 
      obj = Object { holded: h }; 
      return Some(obj); 
     } 
    } 

    None 
} 

fn work2(holder: &Holder) -> Option<Object> { 
    holder.get() 
     .iter() 
     .filter(|h| h.value == 1u8) 
     .map(|h| Object { holded: h }) 
     .next() 
} 

당신은 내가 또한 work() 기능 (work2())를 구현하기위한 다른 방법을 추가 확인합니다.

관련 문제