【问题标题】:Why do return expressions use semicolons when they're unnecessary?为什么返回表达式在不必要时使用分号?
【发布时间】:2015-01-10 13:09:36
【问题描述】:

我正在学习 Rust,但我发现一些函数令人困惑。根据the official reference,返回表达式:

.. [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"
    }

}

当我在“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 非常混乱......因为感觉它是矛盾的)。它只是继承了其他语言的成语吗?

【问题讨论】:

  • 那些; 在 C/C++/Java/Perl 中是必需的,可能还有更多。
  • @Mat - 当然!但是,在 Rust 中,您可以使用最后一行返回一个值没有显式 return... 并且您不使用分号,因为它会评估表达式并返回 () .查看official book 了解我的意思。它似乎不一致......
  • @delnan - 是的。当得知 ; 导致函数返回 () 时,这会让人感到困惑...除非您使用过 return expr;。
  • @delnan official book 不同意你的看法:“我们的函数声称返回 i32,但使用分号,它会返回 ()。”此外,省略分号的情况也很多(例如the official time crate)。
  • @TheCloudlessSky 分号将x + 1 转换为语句,语句计算为()。所以从这个意义上说,分号将返回值转换为(),但恕我直言,这不是考虑它的最佳方式,当然不是对于所有地方的分号。至于time crate:AFAIK 更常见的convention,虽然没有得到 RFC 的正式祝福,但在 returns 上是分号。

标签: rust


【解决方案1】:

它只是继承自其他语言的习语吗?

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

AFAICT,它唯一能做的就是像

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

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

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多