Я хочу открыть файл, заменить некоторые символы и сделать некоторые расщепления. Затем я хочу вернуть список строк. однако я получаю 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;
}
Как я могу присвоить значение, возвращаемое этой функцией в режиме реального времени в зоне действия вызывающего?
Почему преобразование в String увеличивает срок службы? Они принадлежат контейнеру? – ragingSloth
В значительной степени. 'Vec' и' String' владеют контейнерами. Когда вы проходите мимо одного из них, вы фактически передаете права собственности на память, которая была выделена для хранения их значения. '& str' - это просто * заимствованная * ссылка; он может жить только до тех пор, пока он заимствован. –