2016-04-29 82 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

相關問題