我有不时出现的这种模式,但是我还没有找到一种“正确”实现它的好方法。
这是什么,我是否有一些变量通过引用传递到我的函数中。我不需要更改它,我不需要转移所有权,我只需要查看其内容即可。
但是,如果内容处于某种状态,则将其替换为默认值。
例如,假设我的函数接受&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
}
但是这会导致错误:
| fn accept(mut vec: &Vec<String>) {
| - let's call the lifetime of this reference `'1`
| if vec.len() == 0 {
| 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
之外不存在。这不是我的问题。
我的问题是:有没有更干净的方法来写出这种模式?
我不相信这是this的副本,因为与它们不同,我有一个参考,如果可能的话,我想使用first。我不想取消引用或clone()
的引用,因为这将执行不必要的计算。这就是我的问题的标题:我可以同时将值或引用存储在变量中吗? (当然,可能不是,但这就是我想要做的)
如果不使用它,则不必创建默认的vec:
fn accept(input: &Vec<String>) {
let def;
let vec = if input.len() == 0 {
def = vec!["empty".to_string()];
&def
} else {
input
};
// ... do something with `vec`
}