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

时间:2016-04-29 12:13:49

标签: rust

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

返回类型不用于错误处理,因此将其包含在ResultOption中并不合理。

我想要类似的东西:

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

2 个答案:

答案 0 :(得分:12)

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

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

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

您的函数可以返回MustUse<f64>,如果用户写calculate_the_thing(12.3),他们会收到警告,甚至建议以正确的方式获取他们想要的内容:let x = calculate_the_thing(12.3).0;For instance

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

答案 1 :(得分:3)

是的,你可以,感谢RFC 1940并可以从Rust 1.27开始。您的原始代码按原样运行:

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

fn main() {
    calculate_the_thing(21.0);
}
warning: unused return value of `calculate_the_thing` which must be used
 --> src/main.rs:7:5
  |
7 |     calculate_the_thing(21.0);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(unused_must_use)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.71s
     Running `target/debug/playground`