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

为什么“中断”在结束“循环”时不需要分号?

韩照
2023-03-14

《铁锈之书》第3.5章摘录:

我们使用break关键字和值counter*2循环结束后,我们使用分号结束将值赋给result的语句。

加上代码片段:

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}

我理解这是如何工作的,以及为什么结果是20,但我注意到,如果我删除包含break关键字的行上的分号,程序是等效的。

为什么分号在这种情况下是可选的?

共有2个答案

宋岳
2023-03-14

表达式语句上的Rust语言参考:

表达式语句是对表达式求值并忽略其结果的语句。通常,表达式语句的目的是触发对其表达式求值的效果。

仅由块表达式或控制流表达式组成的表达式,如果在允许使用语句的上下文中使用,可以省略后面的分号。

我想这纯粹是为了美学和人体工程学,因为几乎所有东西都是Rust中的表达式。如果在所有表达式之后尾随分号是强制性的,那么我们将不得不用看起来很糟糕的分号来终止if-fe块(也是表达式):

if {
    // do something
} else {
    // do something else
}; // <- gross

类似地,我们可以省略所有控制流表达式上的尾随分号,因为它们会生成控制流,因此分号的典型功能,即放弃表达式的结果并计算为(),变得无关紧要。

fn five() -> i32 {
    return 5 // to semicolon or not to semicolon? it doesn't matter
}

在上面的示例中,我们是否用分号终止返回5并没有什么区别,因为无论如何都不能“捕获”该表达式的结果,因为它会产生控制流。其他控制流表达式(如中断继续)也是如此。

傅自明
2023-03-14

一个简短的例子:

let _: i32 = loop {
    if true {
        break 3; // ()
    }
};

这只是分号不影响预期结果的另一个例子。例如,插入分号会引入表达式语句,其计算结果为单位类型()。由于循环s和如果表达式继续允许对同一类型进行计算的代码块(),则所有类型都是一致的。

let _: i32 = loop {
    if true {
        break 3 // !
    }
};

如果分号被去掉,break将被计算为never类型 ,强制为任何其他类型。这意味着它将实现外部范围所期望的任何类型。所以一切都是一样的,只要在if块结束之前不尝试附加任何其他语句。

中断返回都评估为,因为它们的副作用意味着程序不会通过自然工作流。

另见:

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

 类似资料:
  • 我正在学习Java认证,在一次模拟考试中,我看到了一个非常奇怪的for-loop实现。该练习显示了以下语法: 一开始,我认为这是一个语法错误,因为我一直知道“for循环”的语法需要大括号,或者,如果只有一条指令需要迭代,我们可以跳过大括号,并在循环之后将语句对齐。-因为我以前没见过以分号“;”结尾的For循环-- 然后我试图找到一些关于它的留档,但不幸的是,我找不到任何解释为什么是合法代码声明。仅

  • 我想知道为什么这个函数中的foreach循环在只经过一次循环后输出数据就结束了。我在MySQL中运行了这个查询,它返回了我要查找的8条记录。当I

  • Python新手在这里。我正在编写一个简单的客户端/服务器程序,要求用户输入姓名、用户名、电子邮件地址、密码。此信息被发送到服务器,服务器将检查此用户的文本文件中是否已经有条目。如果有,它应该发送一条消息回来说这个用户已经存在,要求用户再试一次。 我设置了一个名为标志的变量为False。我对照文本文件检查用户信息,如果在文件中没有找到匹配,我将标志设置为true。然后我有一个if语句,它说如果标志

  • 我的问题是关于,它是从方法抛出的。在使用时,我注意到一些我不理解的奇怪行为;我的意思是: 使用此代码,编译器不会给我任何错误或消息,即应该捕获来自的。但是当我试图改变循环条件并用下面这样的变量替换“true”时: 编译器不断抱怨必须处理。有人能给我解释一下为什么会发生这种情况,为什么如果条件设置为true,编译器会忽略InterruptedException?

  • 问题内容: 说你有这个代码 我的问题是,为什么您需要在此处进行while循环。 pthread_cond_wait* 不会只等到信号线程发出 cam_video_cond 信号吗?好的,我知道您可能会遇到以下情况:调用 pthread_cond_wait 时 cam- > status不等于 WAIT_DISPAY ,但是在那种情况下,您可以通过 if 条件检查它,而不是使用 while 。 *

  • 考虑这个简单的C++函数来计算数组的前缀和: 它是4个融合的UOP1,这个CPU可以支持4个融合的OPs/周期。 有通过和携带的依赖链,每个都是一个循环,但是这些UOP可以到4个ALU端口中的任何一个,所以似乎不太可能冲突。融合的需要转到p6,这是一个更令人担忧的问题,但我只测量到p6的1.1 UOPS/迭代。这将解释每次迭代1.1个循环,但不是1.4个循环。如果我将循环展开2倍,端口压力会低得多