3
我有一个返回f64的函数。我想确保使用此函数的输出,而不是仅仅忽略。有没有办法做到这一点?我可以将must_use应用于函数结果吗?
返回类型不用于错误处理,因此将其包装在result
或option
中并没有什么意义。
我想类似这样的东西:
#[must_use]
fn calculate_the_thing(number: f64) -> f64{
number * 2
}
我有一个返回f64的函数。我想确保使用此函数的输出,而不是仅仅忽略。有没有办法做到这一点?我可以将must_use应用于函数结果吗?
返回类型不用于错误处理,因此将其包装在result
或option
中并没有什么意义。
我想类似这样的东西:
#[must_use]
fn calculate_the_thing(number: f64) -> f64{
number * 2
}
不,你不能,#[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]
,但却遭到拒绝的动机不足。
*用*。*提取 - 这是一点点的光滑,我没有想到。很酷! – Shepmaster
如果写入的字节数从['Write :: write'](https://doc.rust-lang.org/std/io/trait.Write.html#tymethod.write)返回,是'must_use',而不仅仅是它包裹的'Result',忽略这一点,并假设所有数据都被写入,可能是一个间歇性的错误。 – poolie
悲伤。 RFC 886本来是太棒了 - (实际上我正在寻找)。 :( – U007D