为什么 return 表达式在不需要时使用分号?

Why do return expressions use semicolons when they're unnecessary?

我正在学习 Rust,我发现了一些与函数混淆的东西。根据the official reference,一个return表达式:

.. [is] denoted with the keyword return. Evaluating a return expression moves its argument into the output slot of the current function, destroys the current function activation frame, and transfers control to the caller frame.

所以,这个程序有效:

fn main() {
    let current_hour = 10;
    let message = get_message(current_hour);

    println!("Good {0}", message);
}

fn get_message(current_hour: i32) -> &'static str {

    if current_hour < 11 {
        return "Morning"
    }
    else if current_hour < 17 {
        return "Afternoon"
    }
    else {
        return "Evening"
    }

}

当我在 "return" 表达式中添加分号时,它仍然有效:

fn main() {
    let current_hour = 10;
    let message = get_message(current_hour);

    println!("Good {0}", message);
}

fn get_message(current_hour: i32) -> &'static str {

    if current_hour < 11 {
        return "Morning";
    }
    else if current_hour < 17 {
        return "Afternoon";
    }
    else {
        return "Evening";
    }

}

我的 understanding of expression statements (e.g. expr;) 是它将计算 expr 表达式,并忽略结果(相反它将使用 ())。在使用 return expr; 的情况下,似乎没有 使用 ; 的理由 因为 return expr 破坏了当前函数激活框架(然后会忽略 ;).

那么,为什么我见过的很多 Rust 代码都在没有必要的情况下使用分号(事实上,这让 learning about Rust's functions 非常混乱......因为感觉它是矛盾的) .它只是从其他语言中继承下来的成语吗?

Is it just an idiom from other languages that has carried over?

是的,我认为就是这样,只是习惯,可能还有一种普遍的审美意识,关于什么感觉怪异,什么感觉不怪异(这当然受到某人以前使用的语言的影响)。

AFAICT,它唯一的区别就是

fn foo() {
    return;
    println!("hi");
}

其中 return 需要是一个语句...但是 return 之后的代码是不可访问的(编译器会告诉你),所以这可能不会发生那么多真实代码。