2015-02-10 14 views
0

我正在通過Rust文檔(書)工作,並且對使用分號分隔語句感到困惑。是println!一個表達式或一個聲明?

在一個實例中它使用println!宏作爲以分號結束的聲明:

use std::cmp::Ordering; 

fn cmp(a: i32, b: i32) -> Ordering { 
    if a < b { Ordering::Less } 
    else if a > b { Ordering::Greater } 
    else { Ordering::Equal } 
} 

fn main() { 
    let x = 5; 
    let y = 10; 

    let ordering = cmp(x, y); 

    if ordering == Ordering::Less { 
     println!("less"); 
    } else if ordering == Ordering::Greater { 
     println!("greater"); 
    } else if ordering == Ordering::Equal { 
     println!("equal"); 
    } 
} 

並採用match表達式簡化它...

use std::cmp::Ordering; 

fn cmp(a: i32, b: i32) -> Ordering { 
    if a < b { Ordering::Less } 
    else if a > b { Ordering::Greater } 
    else { Ordering::Equal } 
} 

fn main() { 
    let x = 5; 
    let y = 10; 

    match cmp(x, y) { 
     Ordering::Less => println!("less"), 
     Ordering::Greater => println!("greater"), 
     Ordering::Equal => println!("equal"), 
    } 
} 

的分號都消失時,這表明println!不是一個聲明,而是一個表達式。我不明白爲什麼...我錯過了什麼?

回答

5

println!()是一個擴展到表達式的宏。它有no useful return value,但它表達式(主要是因爲幾乎所有東西都是表達式,包括函數調用和塊)。

有一個約定—我不知道它是多麼常見,但我一個跟隨它—治療() - 生產函數調用的僞語句,只用於其副作用,因此與他們終止即使不是絕對必要的分號。這是在第一個片段中完成的。

在第二個片段中,我們有一個match,匹配手臂期望一個表達式。人們可以使用一個塊(Ordering::Less => { println!("less"); }),但這是一個相當多的句法噪音,只是爲了更清楚地說明這些手臂是用於其副作用的,所以我想作者只是把它留下了。

+0

'let'賦值還有語句嗎?因爲你甚至可以在Haskell中定義。 – ziggystar 2015-02-10 21:48:34

+0

@ziggystar AFAIK'let'不是一個表達式。 (雖然'{let x = e1; e1}')。 – delnan 2015-02-10 22:01:55