【发布时间】:2020-12-31 00:54:57
【问题描述】:
我对 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 指针。
提前致谢!
【问题讨论】:
-
这能回答你的问题吗? Is there any way to return a reference to a variable created in a function? tl;dr:不,你不能这样做,在 Rust 或任何语言中。而是返回一个拥有的值。
-
我想使用引用,因为克隆对象会非常昂贵。 -- 对于刚接触 Rust 的人来说,这是一个相当常见的错误。因为您返回拥有的东西并不意味着它将被克隆。例如,
String是一个拥有str的类型,但即使你有一个String长一兆字节,从函数返回它最多也只能复制 24 个字节(对于任何Vec都相同)。 -
也许我们彼此误解了,该函数返回一个拥有的 Vec。但是原始的 Vec 并不拥有它的值。我想返回一个有效的 Vec,其中只有一个值被更改,原始的 Vec 保持不变,并且尽可能减少克隆。