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

2024-02-12

摘自第3.5章 https://doc.rust-lang.org/book/ch03-05-control-flow.html#returning-values-from-loops《生锈之书》的内容:

我们使用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关键字,程序是等价的。

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


一个更短的例子:

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

这只是分号不会干扰预期结果的另一个例子。首先,插入分号引入了表达式语句 https://doc.rust-lang.org/stable/reference/statements.html#expression-statements,其计算结果为单位类型()。作为loops and if表达式继续接受计算为相同类型的代码块(),那么所有类型都符合。

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

如果去掉分号,则break被评估为从不类型! https://doc.rust-lang.org/stable/std/primitive.never.html,强制转换为任何其他类型。这意味着它将满足外部作用域所期望的任何类型。在这种情况下,break 3独自也成为()来满足 if 表达式。因此,只要您不尝试在 if 块末尾之前附加任何其他语句,一切都一样。

Both break and return评估为!,因为它们的副作用意味着程序将无法按照自然的工作流程进行。

也可以看看:

  • 为什么返回表达式在不必要时使用分号? https://stackoverflow.com/questions/27876561/why-do-return-expressions-use-semicolons-when-theyre-unnecessary
  • Rust 中使用 return 语句和省略分号有什么区别? https://stackoverflow.com/questions/59013389/whats-the-difference-between-using-the-return-statement-and-omitting-the-semico
  • 如何静态断言函数末尾无法到达 https://stackoverflow.com/q/62405398
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“break”在结束“循环”时不需要分号? 的相关文章

  • 是否可以在不使用“Arc”的情况下拥有“内部指针”?

    struct Device struct CommandBuffer device Device Does not work because Rust does not allow internal pointers struct Some
  • vscode 在哪里使用 lldb 可执行文件?

    我在 vscode 中调试 rust 时遇到困难 它无法评估任何涉及函数的表达式 我注意到我没有安装 lldb Ubuntu 20 04 但调试器仍在运行 在哪里可以找到 lldb 可执行文件 我可以改变路径吗 None
  • 遍历多行字符串

    我得到一些数据 def data some useless text n even more n finally interesting text 我怎样才能得到其中 有趣的部分 所以基本上所有行都不是以 开头的 Groovy 的一种选择是
  • 实现特征时“预期类型参数,找到结构”

    我正在尝试为有向图结构创建一个特征并提供一个非常基本的实现 但遇到编译器错误 pub trait DiGraph lt a gt type N fn nodes
  • 如何在 Dart 中打印美元符号 $

    我实际上需要在 Dart 中在变量之前打印一个美元符号 例如 void main int dollars 42 print I have dollars I have 42 我希望输出为 我有 42 美元 我怎样才能做到这一点 谢谢 飞镖弦
  • 使用比较器对向量进行排序,比较器会动态改变其行为

    我有一个自定义结构体的向量和一个属性列表 用于按优先级降序对该向量进行排序 例如 struct TheStruct artist String title String date String let order vec Vec
  • 如何对 int[] 数组求和[重复]

    这个问题在这里已经有答案了 给定一个数组A of 10 ints 初始化一个名为的局部变量sum并使用循环查找数组中所有数字的总和A 这是我提交的答案 sum 0 while A lt 10 sum sum A 我在这个问题上没有得到任何分
  • 内置魔术变量名称/属性

    背景 对于不熟悉的人来说 崇高的文字 http sublimetext com 和 TextMate 通过以下定义的范围提供语法突出显示和其他功能 tmLanguage语言定义文件 基本上是一堆正则表达式 用于识别给定语言中的各种构造 例如
  • Foreach 更改未保留在 Linq 项目集合上

    在以下示例中 当我返回集合时 不会保留在 foreach 中应用的更改 var people SomeLinqToSqlSource foreach var person in people person Name Jimmy return
  • 为什么 Kotlin 数据类对象有反引号?

    这是我使用 Kotlin 数据类创建器插件创建的数据类 data class ResponseHealthInisghts val data List
  • 过早退出 Qualtrics 中的循环和合并块

    我目前正在进行一项 Qualtrics 调查 受访者必须解决一长串字谜问题 然后回答一些人口统计问题 为了使变位词部分更容易 我使用了循环和合并块 第一个字段是要解决的变位词 第二个字段是变位词的解决方案 因此调查可以根据受访者的答案来检查
  • 如何使用 rustls 库建立 TLS 连接?

    The 文档 https docs rs rustls 0 10 0 rustls 提供了一个例子 不幸的是它不能编译 很多东西都被重命名了 界面也被重命名了ClientSession构造函数改变了 我设法将错误修复到可以编译的程度 但没有
  • 使用模板时什么时候应该使用关键字“typename”[重复]

    这个问题在这里已经有答案了 我最近一直在做一个小项目 但我无法弄清楚一些事情 我得到了一个 h 文件 其中包含一个使用类型名模板的类 那个班级里面有一个私人班级 template
  • 如何在已实现特征的现有类型的枚举范围内实现特征?

    如何在已实现特征的现有类型的枚举范围内实现特征 我有这个 extern crate pnet use pnet packet ipv4 Ipv4Packet use pnet packet ipv6 Ipv6Packet enum Ethe
  • serde/bincode 如何序列化字节数组?

    这段代码完全按照我的要求序列化了一个 32 字节的数组 derive Debug Clone Serialize Deserialize PartialEq Eq PartialOrd Ord struct Hash u8 32 let h
  • 在 VBA 循环中导出查询以根据字符串值选择数据

    我有一个名为 TEST 的表 下面的代码根据 Territory 列中的唯一值循环导出查询 该代码应该根据 Territory 列中的唯一值将数据导出到 Excel 文件 因此每个 Territory 值都有它自己的文件 我在设置 sql
  • 为什么 .each 在我的 Rails 视图中完成后会重复数组? [复制]

    这个问题在这里已经有答案了 在我的 Rails 视图页面中 我有以下循环 它应该循环遍历我的 tag list 数组并打印每个标签 由于某种原因 它在打印每个单独的标签后会重复该数组 例如 这个数组有两个元素 ruby python 每个方
  • 类型“A”没有实现特征“A”

    我正在尝试使用一个具有以闭包作为参数的函数的特征 然后在特征对象上使用它 trait A fn f p self p P where P Fn gt struct B a Box a impl B fn c self self a f 该代
  • C# 计算元音

    我正在学习 C 编程 并且正在尝试计算元音 我让程序循环遍历句子 但它不返回元音计数 而是仅返回字符串的长度 任何帮助将不胜感激 static void Main int total 0 Console WriteLine Enter a
  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型

随机推荐

  • 为 iOS 构建 GMP

    我需要使用GMP在我正在开发的 iPhone 程序中 但真的不知道从哪里开始 我知道我必须为设备构建一个版本 为模拟器构建一个版本 但这就是我所知道的 我尝试环顾四周 但没能找到太多东西 这里有人成功构建吗GMP for iphone愿意指
  • 如何在 swing 中淡入淡出图像?

    我有一个继承自 JPanel 的类 上面有一个图像 我想设置一个小动画来显示面板 图像 然后在事件触发时将其淡出 我大概设置了一个线程并启动动画 但是我该如何真正做到淡入淡出呢 您可以自己进行线程处理 但使用Trident http ken
  • Rcpp 中的折叠向量

    我有一个 Rcpp 函数 它给我一个结果列表 其中包含一些字符串向量 std vector 1 1 0 1 0 0 0 0 2 1 0 0 0 0 0 1 3 1 0 1 0 0 0 0 4 1 0 0 0 1 0 0 我想得到这样的东西
  • React (CRA) Service Worker 缓存“公共”文件夹

    执行 create react app 并启用 Service Worker 后index js 来自的所有相关文件src文件夹被缓存 然而我的一些资源位于public目录 当我跑步时npm run build the asset mani
  • 如何在 Django 中使用 toastr 来显示成功或失败消息

    我一直在使用 Django 消息框架来显示应用程序中的成功或失败消息 但我希望 UI 良好 所以我发现 toastr 是向用户显示消息的好方法 但我不知道如何使用它 请引导我完成这个过程 下面的函数将用户保存到数据库 当保存用户信息时会显示
  • 基于 Mysql Case 语句将一张表连接到另一张表

    我有一张桌子叫PublicForum4 个不同的用户可以发布到 在这个表上我有 2 个字段称为AuthorId int and AuthorType Enum 显示用户 ID 以及哪个用户撰写了该帖子 现在我想选择全部PublicForum
  • Android 布局权重%

    我正在尝试摆弄 Android 布局权重属性 我想要一个具有 3 个子布局 的垂直布局 第一个将占用 25 的空间 第二个将占用 50 最后一个将占用 25 的空间 当我尝试添加到最后一个布局时 一切都不起作用 每个布局的权重应该是多少 我
  • ListView LayoutTemplate 在为空时不显示 asp.net

    我有一个
  • 如何在 ReactJs 中调用另一个类的函数

    我有两个课程 俱乐部 俱乐部和主要应用程序课程 在俱乐部课程中 我收到一份俱乐部列表 并将它们显示在 ul 列表 在里面club类我正在尝试从俱乐部列表中获取单击项目的详细信息 关键是我不知道如何调用中存在的详细函数club类在clubs
  • 将自然语言问题转换为 SQL 查询 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 opennlp Java 库将自然语言问题转换为 SQL 查询 即 谁赢得了索契女子花样滑冰比赛的冠军 应转换为 selec
  • 为什么使用 IDENTITY_INSERT 的 EF 插入不起作用?

    这是查询 using var db new AppDbContext var item new IdentityItem Id 418 Name Abrahadabra db IdentityItems Add item db Databa
  • 如何在Windows Phone 8中设置背景图片?

    我很新WP应用程序 不知道如何设置back ground图像在app xaml整个申请文件在Windows Phone 8应用程序 到目前为止 我已经放置了一些controls超过它但无法设置背景图像 我看过一些材料 但没有用 任何帮助将不
  • 终止另一个应用程序的运行 - Cocoa

    如何终止在酷卡中运行的另一个应用程序 假设我正在运行 iTunes 并且我在应用程序中输入 quit 它将退出 iTunes iTunes 只是一个例子 它可以是用户想要的任何东西 我可以从我的应用程序中打开任何应用程序 但我想知道如何关闭
  • 查找不包含所选字符串的文件

    我正在尝试查找不包含选定字符串的所有文件 查找包含的文件很容易 gci select string something 但我不知道如何否定这个说法 您可以使用Where Object gci Where Object Select Stri
  • 如何 Mockk Kotlin 顶级函数?

    Mockk https mockk io允许模拟静态函数 但是如何模拟 Kotlin 顶级函数呢 例如 如果我有一个名为HelloWorld kt 我如何嘲笑sayHello 功能 HelloWorld kt fun sayHello He
  • 为什么更新 VSCode 后出现此错误?无法读取...的源映射(Node.js)

    我的程序在更新之前可以运行视觉工作室代码 更新后 为什么会出现这个错误 Could not read source map for file c Users s aytan Desktop node new Dashboard2 node
  • AngularJS 子目录路由不起作用,应用了 标签

    我有一个非常简单的 AngularJS 模板 我正在尝试让路由正常工作 但是当我加载页面时 我只看到我的 H1 标签index html 我的应用程序位于子目录中 angular route 并且我知道部分存在 我可以访问 angular
  • Ravendb 计数查询

    我需要获取特定集合中的文档计数 现有索引 Raven DocumentCollections 存储与属于该集合的实际文档配对的集合的计数和名称 如果可能的话 我想从这个索引中获取计数 这是 Raven Document Collection
  • 动态设置水晶报表仍然要求数据库登录

    我正在尝试部署Crystal Reports in my MVC应用 为了充分利用 Crystal Report Viewer 我必须使用webform 它在我的开发环境中运行得相当好 该应用程序将部署在用户的服务器上并连接到他们的个人数据
  • 为什么“break”在结束“循环”时不需要分号?

    摘自第3 5章 https doc rust lang org book ch03 05 control flow html returning values from loops 生锈之书 的内容 我们使用break带有值的关键字coun