我可以将must_use应用于函数结果吗?

tim*_*lyo 5 rust

我有一个函数返回一个f64.我想确保使用此函数的输出,而不是忽略.有没有办法做到这一点?

返回类型不用于错误处理,因此将其包装在一个ResultOption不真正有意义.

我想要类似的东西:

#[must_use]
fn calculate_the_thing(number: f64) -> f64 {
    number * 2.0
}
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 12

不是在Rust 1.27之前.在这些版本中,#[must_use]仅适用于类型,而不适用于单个值.

一种替代方法是定义一个简单的包装类型#[must_use]:

#[must_use = "this value should be used (extract with .0)"]
pub struct MustUse<T>(pub T);
Run Code Online (Sandbox Code Playgroud)

然后你的函数可以返回MustUse<f64>,如果用户写的话calculate_the_thing(12.3),用户会收到警告,甚至建议找到他们想要的东西的正确方法:let x = calculate_the_thing(12.3).0;.例如:

fn calculate_the_thing(number: f64) -> MustUse<f64> {
    MustUse(number * 2.0)
}

fn main() {
    calculate_the_thing(12.3); // whoops

    let x = calculate_the_thing(12.3).0;
    println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)
warning: unused `MustUse` which must be used: this value should be used (extract with .0)
 --> src/main.rs:9:5
  |
9 |     calculate_the_thing(12.3); // whoops
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(unused_must_use)] on by default
Run Code Online (Sandbox Code Playgroud)

  • 如果从 [`Write::write`](https://doc.rust-lang.org/std/io/trait.Write.html#tymethod.write) 返回的写入字节数是`must_use`,而不仅仅是它包含的 `Result`。忽略这一点,并假设所有数据都已写入,很可能是一个间歇性错误。 (2认同)

She*_*ter 8

是的,您可以,这要归功于RFC 1940并且从 Rust 1.27 开始可用。您的原始代码按原样运行:

#[must_use]
fn calculate_the_thing(number: f64) -> f64 {
    number * 2.0
}

fn main() {
    calculate_the_thing(21.0);
}
Run Code Online (Sandbox Code Playgroud)
#[must_use]
fn calculate_the_thing(number: f64) -> f64 {
    number * 2.0
}

fn main() {
    calculate_the_thing(21.0);
}
Run Code Online (Sandbox Code Playgroud)

  • 您是否知道为什么这不是使用 Must_use 注释来注释的函数的默认行为?Swift 的行为是相反的:当我们不想对函数的返回类型执行任何操作时,必须使用 @discardableResult 显式注释该函数(否则:警告)。这看起来比 Rust 的方法更无错误。当创建具有返回类型的函数时,我认为函数的创建者可能希望函数的调用者对结果执行某些操作。添加must_use注释一切都需要大量的噪音和痛苦的维护。 (2认同)