2016-04-29 81 views
3

我有一个返回f64的函数。我想确保使用此函数的输出,而不是仅仅忽略。有没有办法做到这一点?我可以将must_use应用于函数结果吗?

返回类型不用于错误处理,因此将其包装在resultoption中并没有什么意义。

我想类似这样的东西:

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

回答

11

不,你不能,#[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); 
} 
<anon>:9:5: 9:31 warning: unused result which must be used: this value should be used (extract with .0), #[warn(unused_must_use)] on by default 
<anon>:9  calculate_the_thing(12.3); // whoops 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~ 

我的确写了RFC 886提议延长#[must_use],但却遭到拒绝的动机不足。

+0

*用*。*提取 - 这是一点点的光滑,我没有想到。很酷! – Shepmaster

+1

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

+0

悲伤。 RFC 886本来是太棒了 - (实际上我正在寻找)。 :( – U007D

相关问题