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

时间:2015-01-10 13:09:37

标签: rust

我正在学习Rust,我发现了一些令人困惑的功能。根据{{​​3}},返回表达式:

  

.. [is]用关键字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"
    }

}

当我在“返回”表达式中添加分号时,它仍然有效:

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";
    }

}

我的the official reference是评估expr表达式,忽略结果(而不是())。在使用return expr;的情况下,使用;似乎没有原因,因为return expr会破坏当前的功能激活框架(然后会忽略;)。

那么,为什么我见过的很多Rust代码都使用了分号(如果没有必要的话)(实际上让understanding of expression statements (e.g. expr;)非常混乱......因为它感觉它是矛盾的)。这只是其他语言的成语吗?

1 个答案:

答案 0 :(得分:4)

  

这只是其他语言的成语吗?

是的,我认为就是这样,只是习惯,可能是一种普遍的美学感,关于什么感觉很奇怪,什么不感觉(当然受某人之前语言的影响)。

AFAICT,它唯一的区别就是像

这样的东西
fn foo() {
    return;
    println!("hi");
}

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