如何在不使用默认引用时有条件地提供默认引用而不执行不必要的计算?



我有一些变量通过引用传递到我的函数中。我不需要改变它或转移所有权,我只需要看看它的内容。如果内容处于某种状态,我想用默认值替换该值。

例如,我的函数接受&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,这取决于你将如何使用它。

最新更新