我有一些变量通过引用传递到我的函数中。我不需要改变它或转移所有权,我只需要看看它的内容。如果内容处于某种状态,我想用默认值替换该值。
例如,我的函数接受&Vec<String>
,如果Vec
为空,则用vec!["empty"]
:替换它
fn accept(mut vec: &Vec<String>) {
if vec.len() == 0 {
vec = &vec!["empty".to_string()];
}
// ... do something with `vec`, like looping over it
}
但这给出了一个错误:
error[E0716]: temporary value dropped while borrowed
--> src/lib.rs:3:16
|
1 | fn accept(mut vec: &Vec<String>) {
| - let's call the lifetime of this reference `'1`
2 | if vec.len() == 0 {
3 | vec = &vec!["empty".to_string()];
| -------^^^^^^^^^^^^^^^^^^^^^^^^^- temporary value is freed at the end of this statement
| | |
| | creates a temporary which is freed while still in use
| assignment requires that borrow lasts for `'1````
阻止mut
会导致与上一个示例相同的错误:
fn accept(input: &Vec<String>) {
let vec = if input.len() == 0 {
&vec!["empty".to_string()]
} else {
input
};
// ... do something with `vec`, like looping over it
}
我想到的唯一解决方案是提取if
之外的默认值并引用该值:
fn accept(input: &Vec<String>) {
let default = vec!["empty".to_string()];
let vec = if input.len() == 0 {
&default
} else {
input
};
// ... do something with `vec`
}
这会导致代码不那么干净,而且不必要地进行计算。
我知道并理解这个错误。。。您借用的是if
正文中的默认值,但借用的值不存在于if
之外。这不是我的问题。
有没有更干净的方法写出这个图案?
我不认为这是重复的。有什么方法可以返回对函数中创建的变量的引用吗?因为我有一个参考,如果可能的话,我想先使用。我不想取消引用引用或clone()
,因为会执行不必要的计算。
我可以同时在变量中存储值或引用吗?
如果不使用默认向量,则不必创建它。只需确保声明在if
块之外完成即可。
fn accept(input: &Vec<String>) {
let def;
let vec = if input.is_empty() {
def = vec!["empty".to_string()];
&def
} else {
input
};
// ... do something with `vec`
}
请注意,不必每次收到空向量时都构建一个新的默认向量。您可以使用lazy_static或once_cell:在第一次发生这种情况时创建它
#[macro_use]
extern crate lazy_static;
fn accept(input: &[String]) {
let vec = if input.is_empty() {
lazy_static! {
static ref DEFAULT: Vec<String> = vec!["empty".to_string()];
}
&DEFAULT
} else {
input
};
// use vec
}
听起来你可能在寻找std::borrow::Cow
,这取决于你将如何使用它。