gpt4 book ai didi

rust - 在 Rust 中是否有惯用的方法来处理 "reference or create and use reference to it"模式?

转载 作者:行者123 更新时间:2023-12-05 09:27:22 24 4
gpt4 key购买 nike

我意识到在 Rust 中我经常需要执行以下模式:

let variable = &some_ref;

let variable = if something {
let new_variable = create_something();
&new_variable
} else {
variable
};

// Use variable here

换句话说,我需要使用现有的引用或创建一个新的自有值并使用对它的引用。但问题是,如果我像上面的例子那样做,new_variable 的生命周期不够长,它会在第一个 if 子句的末尾被丢弃。

是否有一种惯用的方式来很好地构建代码以实现“使用引用或创建新的并使用对新的引用”的方式?或者我只需要为使用 variable 两次的代码复制/制作函数 - 一次用于我已经有引用的分支,另一次用于我创建自有值并使用引用的分支?

这是我通常如何使用函数(在本例中为 overlay_with_u32)在 2 个分支之间复制行为的真实示例:

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);
};

最佳答案

您可以使用 Cow (写时克隆)为此。

Cow type 是 拥有的或借用的值的 emum:

pub enum Cow<'a, B>
where
B: 'a + ToOwned + ?Sized,
{
Borrowed(&'a B),
Owned(<B as ToOwned>::Owned),
}

您可以像这样使用它(为清楚起见重命名变量):

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)
};

接受 &T 的函数可以给一个&Cow<T> ,它将按照您的预期自动被引用:

let variable: Cow<'_, i32> = Cow::Owned(3);
do_stuff(&variable);

fn do_stuff(i: &i32) {
println!("{}", i);
}

关于rust - 在 Rust 中是否有惯用的方法来处理 "reference or create and use reference to it"模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72517947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com