我有一个结构参考。
我需要引用一个结构。有时是相同的,但有时是克隆然后修改的。
现在,我知道
if condition {
let mut copy = original.clone();
copy.select();
do_big_thing(©);
} 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();
©
} else {
original
};
do_big_thing(reference);
Run Code Online (Sandbox Code Playgroud)
由于此问题是关于寻找一种更简洁,更整洁的方式写同一件事(使用原始引用或克隆),因此我无法接受会在运行时增加开销或其他开销的解决方案unsafe
。
由于您不打算从函数中返回值(如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();
©
} else {
original
};
do_big_thing(r, a);
}
Run Code Online (Sandbox Code Playgroud)
编译器将确保仅在该值有效时引用。这产生相同的组件设置为Cow
版本,我认为该Cow
版本是比较明显的,但它仍然要知道一个有用的技术。
也可以看看: