需要参考时有条件克隆

Den*_*ret 2 rust

我有一个结构参考。

我需要引用一个结构。有时是相同的,但有时是克隆然后修改的。

现在,我知道

if condition {
    let mut copy = original.clone();
    copy.select();
    do_big_thing(&copy);
} else {
    do_big_thing(original);
}
Run Code Online (Sandbox Code Playgroud)

但是do_big_thing有其他论点,我不想重复这一行。

有没有办法

  • 首先构建引用,该引用可以是原始引用,也可以是本地修改克隆的引用
  • 然后使用它do_big_thing(它的寿命不必更长)

当然,这是行不通的,因为copy寿命不长:

let mut reference = if condition {
    let mut copy = original.clone();
    copy.select();
    &copy
} else {
    original
};
do_big_thing(reference);
Run Code Online (Sandbox Code Playgroud)

由于此问题是关于寻找一种更简洁,更整洁的方式写同一件事(使用原始引用或克隆),因此我无法接受会在运行时增加开销或其他开销的解决方案unsafe

操场

She*_*ter 6

由于您不打算从函数中返回值(如Rust是否可以返回借入或拥有的类型?中所示),因此无需使用Cow。相反,您可以copy在条件之外声明变量:

fn do_huge_thing_stack(original: &Big, a: usize, condition: bool) {
    let mut copy;

    let r = if condition {
        copy = original.clone();
        copy.select();
        &copy
    } else {
        original
    };

    do_big_thing(r, a);
}
Run Code Online (Sandbox Code Playgroud)

编译器将确保仅在该值有效时引用。这产生相同的组件设置为Cow版本,我认为Cow版本是比较明显的,但它仍然要知道一个有用的技术。

也可以看看: