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

标签 rust lifetime

我对 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;
}

关于Rust 指定局部变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63865037/

相关文章:

struct - 为什么生命周期强制转换适用于结构而不适用于特征?

rust - 如何在 Rust 的特定内存区域中声明静态变量?

rust - 将可变 Arc 引用传递给 hyper service_fn 处理程序

database - 数据的生命周期是多少?

reference - 有没有办法返回对函数中创建的变量的引用?

rust - 为什么 Rust 不能在简单的闭包中推断出正确的生命周期,或者推断出它们是冲突的?

rust - 类型不匹配 : expected somestruct<_, _> 得到了一些结构<R,F>

rust - rust 生命周期参数必须超过静态生命周期

rust - 解决通过引用获取参数的闭包的类型不匹配

rust - 所有权,关闭,FnOnce : much confusion