2017-01-27 5 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 
} 

Сообщение об ошибке:

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+appro++++++++++++++++++++++++++++++++++++++++++ + требования). Возможно, вы могли бы потратить время на просмотр некоторых из них и объяснить, почему * этот * вопрос особенный и другой, и на него еще не ответили? – Shepmaster

+0

Я уже видел многие из них, но проблема здесь в основном я не понимаю. _why_ У меня есть эта ошибка, и, увидев, что другой пост мне не помогает. –

+0

Я также видел многие из них, и проблема объясняется в одном. - Посмотрите, насколько это полезно, когда вы не указываете, что не так * с * любым * из существующих вопросов? Если вы не скажете нам, что не так, мы просто повторим тот же ответ, который вы уже не понимаете, вам не помогут, и, что еще хуже, будет еще один ответ, что следующий человек не будет читать и вместо этого игнорировать и просить, чтобы их код был исправлен. – Shepmaster

ответ

0

В MCVE вы выложили, то структура Object содержит ссылку на Holded:

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

В функции 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().

Я переписал ваш пример, чтобы включить Holded внутри 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()).

Смежные вопросы