为什么 Rust 允许在一个作用域中两次声明相同的变量名? [复制]

2023-11-29

我第一次遇到允许在同一范围内声明变量名称两次的类型化语言。难道不会有机会错误地覆盖现有变量吗?它带来什么优势?


书中有一章介绍了这一点。

隐藏与将变量标记为 mut 不同,因为如果我们不小心尝试在不使用 let 关键字的情况下重新分配给该变量,我们将收到编译时错误。通过使用let,我们可以对一个值执行一些转换,但在这些转换完成后变量是不可变的。

mut 和 Shadowing 之间的另一个区别是,因为当我们再次使用 let 关键字时,我们实际上是在创建一个新变量,所以我们可以更改值的类型,但重复使用相同的名称。例如,假设我们的程序要求用户通过输入空格字符来显示他们想要在某些文本之间有多少个空格,但我们确实希望将该输入存储为数字

let spaces = "   "; // String
let spaces = spaces.len(); // number

简而言之,它允许您以技术上不可变的方式“修改”值。 Rust 确保您不能使用隐藏变量,因此它是完全类型安全的。

我不是 Rust 专家,但从语言设计的角度来看,这是一件值得鼓励的有趣的事情。但我认为重点是不鼓励尽可能使用可变值,允许您用新类型和值一成不变地覆盖名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Rust 允许在一个作用域中两次声明相同的变量名? [复制] 的相关文章

随机推荐

  • Google Apps 脚本 - 可能的图表类型

    我是 Google Apps 脚本的新手 所以我只是在探索我想要实现的目标是否可能 我需要从 Google 表单中检索并在单独的文档中显示根据每个单独表单提交的数据创建的图表 我知道这是可以做到的 我遇到的问题是我想要的图表类型似乎不可用h
  • 检查提交表单时至少选中一个复选框

    我有一个由复选框字段组成的表单 现在在表单提交时我们应该检查是否至少选中了一个复选框 html代码
  • Linux 在编译时随机删除了我的文件,我该怎么办?

    gcc L root Desktop Wall o prog3 c pthread lcopy usr lib gcc x86 64 linux gnu 7 x86 64 linux gnu Scrt1 0 In function star
  • Office 365 Rest API - 检索纯文本电子邮件

    目前是否可以使用 Office 365 Rest API 来检索电子邮件的纯文本部分 从 API 文档中可以看出 Body 对象包含 ContentType 字段 该字段可以是Text or HTML https msdn microsof
  • 模拟 Hibernate 会话

    我试图模拟休眠会话 这是我尝试过的代码片段 Before public void setUp campaignModel DraftTestHelper buildDraftModel if sessionFactory null Syst
  • 每次 ajax 调用后不同的 Facebook 评论框

    我的问题是这样的 我有一个网页 每次用户单击按钮时该网页都会发生变化 标题已更新 图表 鉴于页面现在有不同的内容 我希望有一个不同的评论部分 但是 url 是完全相同的 因为所有内容都是 ajax 加载的 所以我想知道是否也可以生成一个新的
  • FormData 无法在 Internet Explorer 中工作?

    function uploadPhoto file if file file type match image if file postStatus else return var fd new FormData fd append ima
  • get_path() 从 matplotlib.patches 返回一个 Circle

    有谁知道是什么get path of a Circle from matplotlib patches回报 这get path 圆的返回值与原始圆不同 这可以从下面代码的结果中看出 从附图中可以看出 原来的橙色圆圈与图中的蓝色圆圈完全不同
  • ffmpeg 中的 mp3 音频 + 背景.jpg = 结果.mp4

    将视频转换为 mp4 以上传到 YouTube 时遇到问题 我已使用以下命令转换为 avi 格式 ffmpeg y i background jpg i deepmix mp3 c a copy result avi 但是当我将其上传到 y
  • 如何使用 JDBC 调用 PostgreSQL 存储过程

    我正在使用 postgresql 并且创建了一些存储过程 现在我想通过jdbc访问存储过程并处理结果 存储过程的结果是整数或表 我发现了以下内容 CallableStatement upperProc conn prepareCall ca
  • 如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中

    我有两个 UInt64 即 64 位四字 整数 它们与 8 字节对齐 sizeof UInt64 边界 如果这对任何事情有用的话 我也可以将它们对齐到 16 字节 它们被挤在一起 所以它们在内存中是并排的 我如何将它们加载到 xmm 寄存器
  • substr() 未按预期工作

    我只是想提取日期year month and day分开 以便我可以按照我的意愿使用它 我将当前日期存储在 today并使用substr 从中提取字符串 但我从我所做的事情中得到了一些奇怪的行为 我当前的代码 today date Y m
  • iOS 自定义导航栏后退按钮标题在点击时消失

    你好 StackOverflow 社区 我有一个相当奇怪的情况 导航控制器的导航栏上的自定义后退按钮在交互时消失 一些附加信息是我的代码没有使用 Storyboard 而是使用 UIKit 包括 UI 在内的所有内容都是以编程方式构建的 这
  • 如何在另一种方法中使用一种方法的“返回”值

    我目前正在开发这个玩高低骰子游戏的项目 我被困在如何使用返回的char from getHighLow和返回的int from getBet and getRoll in determineWinnings 这是我目前学习 Java 的第一
  • 如何在软件中模拟浮点运算? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 当CPU没有 或有问题 浮点单元时 软件如何执行浮点运算 例如 PIC AVR 和 8051 微控制器架构 效仿 在 PIC AVR 和 8051 上下文中 浮点 是错误的术语
  • 确保字符串文字联合属于对象的键

    export type A a b c const obj a 4 b 5 c 6 d 7 我如何确保所有元素A是对象的键obj 根据您的需要 您可以自动构造您的类型 所有键作为一个类型 您可以使用keyof将所有密钥作为一个联合体 自从k
  • 如何根据 Javascript 中的多个键对对象数组进行分组?

    我的数组如下 WarehouseId 1 ShippingCarrierId 1 PostalCodeType ShipToCustomer TimeStart 1970 01 01T06 00 00 000Z TimeEnd 1970 0
  • 使用 jQuery AJAX 发送带有二进制数据的 FormData

    我想发送一个FormData通过使用 jQuery AJAX 例如 var uploadFormData new FormData uploadFormData append name value ajax url URL target t
  • 当我返回时,控制到达非空函数的末尾[重复]

    这个问题在这里已经有答案了 我有一个函数 它递归地调用自身 直到连接到服务器 然后函数返回0 为什么我有这样的错误行为 控制到达非空函数的末尾 指向函数结束的行 我做错了什么 我有 if else 语句 仅在 else 中返回 但即使在 i
  • 为什么 Rust 允许在一个作用域中两次声明相同的变量名? [复制]

    这个问题在这里已经有答案了 我第一次遇到允许在同一范围内声明变量名称两次的类型化语言 难道不会有机会错误地覆盖现有变量吗 它带来什么优势 有书中有一章介绍了这一点 隐藏与将变量标记为 mut 不同 因为如果我们不小心尝试在不使用 let 关