当前位置: 首页 > 知识库问答 >
问题:

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

南门向荣
2023-03-14

我正在学习Rust,我发现函数有些混乱。根据官方参考,一个返回表达式:

...[is]用关键字返回表示。评估返回表达式将其参数移动到当前函数的输出槽中,破坏当前函数激活帧,并将控制权转移到调用者帧。

所以,这个程序工作:

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

}

我对表达式语句(例如expr;)的理解是,它将计算expr表达式,并忽略结果(而是使用())。如果使用return expr ,似乎没有理由使用因为return expr会破坏当前函数激活帧(然后会忽略)。

那么,如果没有必要,为什么我看到的很多锈迹代码会使用分号呢(事实上,学习锈迹的函数会让人非常困惑……因为这感觉很矛盾)。这只是其他语言流传下来的习语吗?


共有1个答案

丁振海
2023-03-14

这只是其他语言中的一个习语吗?

是的,我想就是这样,只是习惯,可能还有一种关于什么感觉奇怪,什么感觉不奇怪的一般审美观(这当然受到某人以前语言的影响)。

目前,它所能带来的唯一不同是

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

其中return需要是一个语句。。。但是返回之后的代码是不可访问的(编译器会告诉您),所以在实际代码中这种情况可能不会发生太多。

 类似资料:
  • 《铁锈之书》第3.5章摘录: 我们使用关键字和值。循环结束后,我们使用分号结束将值赋给的语句。 加上代码片段: 我理解这是如何工作的,以及为什么结果是20,但我注意到,如果我删除包含关键字的行上的分号,程序是等效的。 为什么分号在这种情况下是可选的?

  • 我正在尝试从C转换到Java。 我想知道的是,在C中,在类定义之后需要分号(),但在Java中则不是。 也就是说,在C中: 但在Java中: 那很好,我理解。 然而,我的问题是: 当我在类定义的末尾添加分号时,Java也可以工作,例如: 我已经编译并执行了为Java显示的两个程序片段,它们都有效。有人能解释为什么会这样吗?Java中类定义末尾的分号代表什么? 如果这个问题质量不高,我很抱歉,但我真

  • 问题内容: 我正在尝试从C ++转向Java。 我想知道的是,在C ++中,在类定义之后,需要使用分号(),而在Java中则不需要。 也就是说,在C ++中: 但是在Java中: 很好,我知道。 但是, 我的问题是 : 当我在类定义的末尾添加分号时,Java也可以使用,例如: 我已经编译并执行了Java所示的两个程序片段,并且它们均有效。谁能解释为什么会这样?Java类定义末尾的分号代表什么? 很

  • 问题内容: 本周我们公司一直在就如何编写SQL脚本进行辩论。 背景:我们的数据库是Oracle 10g(即将升级到11)。我们的DBA团队使用SQLPlus来将我们的脚本部署到生产环境中。 现在,我们最近的一次部署失败了,因为它同时使用了分号和正斜杠()。分号位于每个语句的末尾,斜线位于语句之间。 稍后在脚本中添加了一些触发器,创建了一些视图以及一些存储过程。同时使用和和导致每个语句运行两次会导致

  • 我试图更好地理解C#的编译器。它坚持所有代码路径必须返回一个值,我认为这是相当公平的。 这将不会编译:

  • 问题内容: 我有这样的字符串 我想用冒号作为分隔符,而不是双冒号。所需结果: 我正在尝试: 但我得到了错误的结果。 在此期间,我逃避,用 问题答案: 您可以继续讨论。这使用两个否定的环视(回溯和回溯),它们断言有效匹配只有一个冒号,在它之前或之后没有冒号。 解释模式: 这两种环视都是必需的,因为如果只有后向,则正则表达式引擎将匹配其中的第一个冒号(因为前一个字符不是冒号),如果只有前瞻,则第二个冒