ant*_*nyk 2 rust borrow-checker
我意识到在 Rust 中我经常需要执行以下模式:
let variable = &some_ref;
let variable = if something {
let new_variable = create_something();
&new_variable
} else {
variable
};
// Use variable here
Run Code Online (Sandbox Code Playgroud)
换句话说,我需要使用现有引用或创建新的拥有值并使用对其的引用。但问题是,如果我像上面的例子那样做,它的new_variable寿命就不够长,它会在第一个子句的末尾被删除if。
是否有一种惯用的方法可以很好地构造代码以实现“使用引用或创建新的并使用对新的引用”的方式?或者我只需要为使用variable两次的代码复制/制作函数 - 一次用于我已经有引用的分支,另一个用于我创建拥有值并使用对其的引用的分支?
overlay_with_u32这是我通常如何使用函数(在本例中)在两个分支之间复制行为的真实示例:
let source = &source;
if is_position_negative(x, y) {
let source = crop(source, x, y);
overlay_with_u32(destination, &source, x, y);
} else {
overlay_with_u32(destination, source, x, y);
};
Run Code Online (Sandbox Code Playgroud)
Cow为此,您可以使用(Clone-on-write)。
该类型是自有值或借用值Cow的 emum :
pub enum Cow<'a, B>
where
B: 'a + ToOwned + ?Sized,
{
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它(为了清楚起见,将变量重命名):
use std::borrow::Cow;
let variable_ref = &some_ref;
let variable = if something {
let variable_created = create_something();
Cow::Owned(variable_created)
} else {
Cow::Borrowed(variable_ref)
};
Run Code Online (Sandbox Code Playgroud)
接受 a 的函数&T可以被赋予 a &Cow<T>,它将自动按照您的预期进行引用:
let variable: Cow<'_, i32> = Cow::Owned(3);
do_stuff(&variable);
fn do_stuff(i: &i32) {
println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |