Rust指定局部变量的生存期

问题描述

我对Rust还是很陌生,但是生命周期说明符的概念仍然存在问题。

我有Vec(或任何其他集合)的参考文献。现在,我想用另一个对新创建的局部变量的引用替换特定的引用。现在的问题是,新局部变量的寿命比向量短,这会使引用无效。

一个示例代码尝试执行我想要的操作,但会引发编译时错误

fn main() {
    let values = ["one".to_string(),"lorem".to_string(),"three".to_string()];
    let borrowed_values = vec![&values[0],&values[1],&values[2]];
    println!("{:?}",do_the_impossible(borrowed_values));
}

fn do_the_impossible(mut data: Vec<&String>) -> Vec<&String> {
    let replacement = "two".to_string();
    data[1] = &replacement;
    return data;
}

问题现在是:如何创建与向量具有相同生存期的新变量?

我想使用引用,因为克隆对象会非常昂贵。

我最初的想法是使用生存期说明符,这些说明符表明局部变量应该与向量一样长。但是我找不到正确的语法方法来做到这一点。甚至可以指定局部变量的生存期吗?

如果不是,是否还有其他方法可以避免克隆载体的元素?我的最后一招是使用Rc指针。

谢谢!

解决方法

这听起来像是std::borrow::Cow的用例,它使您可以拥有借用或拥有的值作为后盾的值。

您可以改写类似的内容:

use std::borrow::Cow;

fn main() {
    let values = ["one".to_string(),"lorem".to_string(),"three".to_string()];
    let borrowed_values: Vec<_> = values.iter().map(Cow::Borrowed).collect();
    println!("{:?}",do_the_impossible(borrowed_values));
}

fn do_the_impossible<'a>(mut data: Vec<Cow<'a,String>>) -> Vec<Cow<'a,String>> {
    let replacement = "two".to_string();
    data[1] = Cow::Owned(replacement);
    return data;
}