Rust 指定局部变量的生命周期

Pil*_*kio 5 lifetime 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

提前致谢!

Dan*_*all 5

这听起来像是 的一个用例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;
}
Run Code Online (Sandbox Code Playgroud)