Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Expression 是普林顿!表达还是陈述?_Expression_Rust - Fatal编程技术网

Expression 是普林顿!表达还是陈述?

Expression 是普林顿!表达还是陈述?,expression,rust,Expression,Rust,我正在浏览Rust文档(书),对它使用分号分隔语句感到困惑 在一个例子中,它使用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() {

我正在浏览Rust文档(书),对它使用分号分隔语句感到困惑

在一个例子中,它使用
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");
    }
}
分号消失了,表示
println
不是一个语句,而是此上下文中的一个表达式。我不明白为什么。。。我错过了什么

println!()
是扩展为表达式的宏。它有,但它是一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块)

有一个惯例——我不知道它有多普遍,但我遵循它——将产生函数调用的
)视为伪语句,仅用于其副作用,因此即使在没有严格必要时也用分号终止它们。这是在第一个代码段中完成的

在第二个代码片段中,我们有一个
match
,match-arms需要一个表达式。我们可以使用块(
Ordering::Less=>{println!(“Less”);}
),但这是一个相当大的语法噪音,只是为了更清楚地说明手臂是用于它们的副作用,所以我想作者刚刚停止了它。

println!()
是扩展为表达式的宏。它有,但它是一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块)

有一个惯例——我不知道它有多普遍,但我遵循它——将产生函数调用的
)视为伪语句,仅用于其副作用,因此即使在没有严格必要时也用分号终止它们。这是在第一个代码段中完成的


在第二个代码片段中,我们有一个
match
,match-arms需要一个表达式。我们可以使用块(
Ordering::Less=>{println!(“Less”);}
),但这是一个相当大的语法噪音,只是为了更清楚地表明手臂是用于其副作用的,所以我想作者刚刚停止了它。

赋值语句也是语句吗?因为即使在Haskell中也可以有定义。@ziggystar AFAIK
let
不是表达式。(
{let x=e1;e1}
虽然如此。)
let
赋值也是语句吗?因为即使在Haskell中也可以有定义。@ziggystar AFAIK
let
不是表达式。(
{let x=e1;e1}
虽然如此)。
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"),
    }
}