繁体   English   中英

Rust 中是否有惯用的方法来处理“引用或创建和使用对它的引用”模式?

[英]Is there idiomatic way to handle "reference or create and use reference to it" pattern in Rust?

我意识到在 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 2 次的代码复制/制作 function - 一次用于我已经有引用的分支,另一次用于我创建拥有值并使用引用的分支?

这是我通常如何使用 function(在本例中为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类型是拥有借用值的 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);
}

使用Cow可能是正确的做法,但在这里我将建议另一种方法,它可能更便宜(特别是如果类型是Drop -less,在这种情况下它是零成本的,除了它可能需要更多的堆栈空间),但需要更多代码并且可能不太明显。

Rust 允许你声明一个变量但是有条件地初始化它,只要编译器能够证明这个变量在使用时总是被初始化。 您可以利用这一事实来延长 scope 中变量的生命周期; 代替:

let reference = {
    let variable = ...;
    &variable
};

你可以写:

let variable;
let reference = {
    variable = ...;
    &variable
};

但是现在variable的寿命足够长了。

适用于您的情况,它看起来像:

let variable = &some_ref;
let new_variable;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM