Rust 指定局部变量的生命周期
Rust specify lifetime of local variable
我对 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 很陌生,对生命周期说明符的概念仍然有疑问。
我有一个 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;
}