如果表达式产生值或引用?

问题描述 投票:0回答:1

我有不时出现的这种模式,但是我还没有找到一种“正确”实现它的好方法。

这是什么,我是否有一些变量通过引用传递到我的函数中。我不需要更改它,我不需要转移所有权,我只需要查看其内容即可。

但是,如果内容处于某种状态,则将其替换为默认值。

例如,假设我的函数接受&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()的引用,因为这将执行不必要的计算。这就是我的问题的标题:我可以同时将值或引用存储在变量中吗? (当然,可能不是,但这就是我想要做的)

rust
1个回答
0
投票

如果不使用它,则不必创建默认的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`
}
© www.soinside.com 2019 - 2024. All rights reserved.