为什么 _ destroy 在语句末尾?

2024-04-20

我看到了其他一些问题answers https://stackoverflow.com/a/25877389/221955说明let _ = foo()在语句末尾而不是在作用域退出时销毁结果,这就是let _a = foo() does.

我找不到任何官方描述,也找不到这种语法的任何理由。

我对一些相互交织的事情感兴趣:

  • 官方文档中是否有提及?
  • 这一选择背后的历史背景是什么?这只是 Rust 绑定/解构规则的自然结果吗?它是从另一种语言继承的吗?还是有其他的起源?
  • 该语法是否存在某些使用显式作用域无法实现的用例?

这只是 Rust 绑定/解构规则的自然结果吗?

是的。你用_表明您不关心模式中的值,并且它不应该首先被绑定。如果一个值从未绑定到变量,则没有任何东西可以保留该值,因此必须删除它。

所有地方都可以使用图案 https://doc.rust-lang.org/book/second-edition/ch18-01-all-the-places-for-patterns.html:

  • match Arms
  • 有条件的if let表达式
  • while let条件循环
  • for Loops
  • let声明
  • 功能参数

官方文档中是否有提及?

忽略整个值_ https://doc.rust-lang.org/book/second-edition/ch18-03-pattern-syntax.html#ignoring-an-entire-value-with-_

值得注意的是_ isn't 有效的标识符 https://doc.rust-lang.org/reference/identifiers.html,因此您不能将其用作名称:

fn main() {
    let _ = 42;
    println!("{}", _);
}
error: expected expression, found reserved identifier `_`
 --> src/main.rs:3:20
  |
3 |     println!("{}", _);
  |                    ^ expected expression

使用显式范围界定来实现

我想你可以走这条路,让表达式这样做只是“徘徊”,直到范围结束,但我没有看到它有任何价值:

let _ = vec![5];    
vec![5]; // Equivalent
// Gotta wait for the scope to end to clean these up, or call `drop` explicitly
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 _ destroy 在语句末尾? 的相关文章

随机推荐

  • 从 powershell 脚本引用 .Net .dll

    您能帮我从 powershell 脚本引用 Net dll 吗 我正在使用 powershell ISE 编写 调试脚本 我有一些引用 Nuget 包的 net 代码 我想将该代码嵌入到 powershell 脚本中 如果我在 C WIND
  • 创建片段时的NPE

    我正在创建一个关于Fragment with sensorEventlitener 主要活动主办fragment如下代码所示 但在运行时我收到下面发布的内容logcat Errors 主要活动 public class MainActivi
  • 用于查找应用于特定分支的标签的命令

    用于查找应用于特定分支的标签的命令 假设我有一个名为 BR test 的分支名称 我想知道该分支上应用的所有标签是什么 如果这是 UCM 一个简单的lsbl就足够了 cleartool lsbl stream myStream mypvob
  • Django 的内存错误

    我有一个 Django 应用程序 它将大量数据加载到 sqlite3 数据库文件中 我们正在谈论数百万个条目 这些条目输入到一个函数中 在执行的某个时刻会抛出异常 File root codebase lib python2 6 site
  • 从单例类中检索 Ruby 对象?

    可以访问单例类 https ruby doc org core 2 5 1 Object html来自 Ruby 对象 some object singleton class 是否可以进行相反的操作 在单例类中访问原始对象 class lt
  • 找不到 com.google.android.gms:play-services:7.3.0

    我有来自 Android Studio gradle 的日志 Error A problem occurred configuring project ParseStarterProject gt Could not resolve all
  • 返回对象中项目总数的最佳 RESTful 方法是什么?

    我正在为我参与的一个大型社交网站开发 REST API 服务 到目前为止 它运行良好 我可以发出GET POST PUT and DELETE请求对象 URL 并影响我的数据 但是 此数据是分页的 一次限制为 30 个结果 通过我的 API
  • 使用 php 缩短 if else 语句

    我有一个关于缩短 if else 语句的问题 我正在尝试使用制作天气应用程序打开天气地图 https openweathermap org weather conditionsAPI 但我不喜欢那些图标 我想像这样更改图标 if desc
  • 如何在 Android 上显示当前可见活动的对话框?

    我的问题类似于这个2年前的问题 https stackoverflow com questions 3136187 how to detect if any of my activity is front most and visible
  • lib 未指定 & loadNamespace 中出现错误

    我的一切都可以使用 R 和 RStudio 但后来我在清理计算机目录和文件时移动了文件夹 现在我收到以下错误消息 R和RStudio应该安装在Program Files or Program Files x86 我应该有两个libPaths
  • 如何爆炸空间分隔的柱子?

    我在 Spark Scala 中有一个示例数据框 其中包含一列和许多其他列 50 并且需要分解 id 示例数据 id name address 234 435 567 auh aus 345 123 muji uk 输出数据 id name
  • MySQL 的 COUNT 运行总计

    我知道set running sum 0 running sum running sum 方法 但是 它似乎不适用于我的情况 我的查询 SELECT DISTINCT date COUNT AS count FROM table1 WHER
  • 如何知道我的项目上运行的是哪个版本的 PyMongo

    我正在开发一个python项目 在需求文件中我有三种不同类型的PyMongo Flask PyMongo 0 3 1 pymongo 2 7 flask mongoengine 0 7 1 如何定义我正在使用哪个版本 如果你有pip安装后
  • 从 Android 打印到 AirPrint 打印机 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁听说过有人在 Android 上
  • 如何使用where子句从存储在PostgreSQL中jsonb列类型的JSON数组中修改或删除特定的JSON对象?

    在我的 Postgres 数据库中 我有一个具有 jsonb 数据类型的表列 在该列中 我存储 JSON 数组 现在 我想删除或修改数组内的特定 JSON 对象 我的 JSON 数组看起来像 ModuleId 1 ModuleName XY
  • 使用一项识别服务保护 2 个不同的 Web 应用程序

    使用一项识别服务保护 2 个不同的 Web 应用程序 身份服务 Thinktecture身份服务V2应用1 Asp net MVC 5应用应用2 Asp net Web API应用 上述应用程序1和应用程序2是不同的项目并托管在不同的服务器
  • 编译器是否优化了净零位移?

    我有一些代码 如下面的代码块 我不允许发布原始代码 cpp我认为正在编译的文件clang Ubuntu clang version 3 5 2 3ubuntu1 tags RELEASE 352 final based on LLVM 3
  • mysql 中的 Rank() 优于 Partition by

    我完全困惑于在mysql中从rank over partition by x order by y desc 创建一个新列 LoginRank 在sql server中 我将编写以下查询 以创建一个按 login 分组并按 id 排序的列
  • 在 AS3 中快速设置关键帧上的实例名称

    现在在 Flash CS3 及更高版本 使用 Actionscript 3 中 如果您在图层中的多个关键帧中使用相同的实例 并且您决定稍后分配或更改实例名称 则必须转到每个关键帧并设置实例名称 这是一个很大的麻烦 有没有更快或更好的方法来做
  • 为什么 _ destroy 在语句末尾?

    我看到了其他一些问题answers https stackoverflow com a 25877389 221955说明let foo 在语句末尾而不是在作用域退出时销毁结果 这就是let a foo does 我找不到任何官方描述 也找