2014-11-21 5 views
1

Я хочу открыть файл, заменить некоторые символы и сделать некоторые расщепления. Затем я хочу вернуть список строк. однако я получаю error: broken does not live long enough. Мой код работает, когда он в основном, поэтому это проблема только со временем жизни.Срок службы не достаточно ржавчина

fn tokenize<'r>(fp: &'r str) -> Vec<&'r str> { 
    let data = match File::open(&Path::new(fp)).read_to_string(){ 
     Ok(n) => n, 
     Err(e) => fail!("couldn't read file: {}", e.desc) 
    }; 
    let broken = data.replace("'", " ' ").replace("\"", " \" ").replace(" ", " "); 
    let mut tokens = vec![]; 

    for t in broken.as_slice().split_str(" ").filter(|&x| *x != "\n"){ 
     tokens.push(t) 
    } 
    return tokens; 
} 

Как я могу присвоить значение, возвращаемое этой функцией в режиме реального времени в зоне действия вызывающего?

ответ

3

Проблема заключается в том, что ваша подпись функции говорит: «результат имеет такое же время жизни, что и вход fp», но это просто не так. Результат содержит ссылки на data, которые выделяются внутри вашей функции; он не имеет ничего общего с fp! Как бы то ни было, data перестанет существовать в конце вашей функции.

Поскольку вы эффективно создаете новые значения, вы не можете возвращать ссылки; вам необходимо передать право собственности на эти данные из функции. Есть два способа я могу думать о том, чтобы сделать это, с верхней части моей головы:

  1. Вместо возвращения Vec<&str>, возвращающие Vec<String>, где каждый маркер представляет собой недавно распределённая строка.

  2. Возврат data внутри типа обертки, который реализует логику расщепления. Затем вы можете получить fn get_tokens(&self) -> Vec<&str>; время жизни срезов может быть привязано к времени жизни объекта, который содержит data.

+0

Почему преобразование в String увеличивает срок службы? Они принадлежат контейнеру? – ragingSloth

+0

В значительной степени. 'Vec' и' String' владеют контейнерами. Когда вы проходите мимо одного из них, вы фактически передаете права собственности на память, которая была выделена для хранения их значения. '& str' - это просто * заимствованная * ссылка; он может жить только до тех пор, пока он заимствован. –

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