Rustlings 变量练习详解Rust 的不可变性与mut、遮蔽Shadowing与常量【免费下载链接】rustlings:crab: Small exercises to get you used to reading and writing Rust code!项目地址: https://gitcode.com/gh_mirrors/ru/rustlingsRust 语言中变量默认是不可变的immutable这一设计直接决定了所有 Rust 程序的编写方式。本文以 Rustlings 仓库中 exercises/01_variables/README.md 为核心结合 6 个循序渐进的小练习variables1 ~ variables6、官方参考答案solutions/01_variables/与练习提示配置rustlings-macros/info.toml系统讲解变量的声明、类型推断、可变性、遮蔽以及常量与变量的区别。读完本文你不仅能独立完成 01_variables 全部练习还能理解 Rust 编译器在背后替你拦下了哪些易犯错误。Rust 变量默认不可变与多数编程语言不同Rust 中的变量绑定variable binding默认是不可变的。这意味着一旦把一个值绑定到某个名字上就不能再修改这个值。Rustlings 的变量练习 README 开宗明义地写道In Rust, variables are immutable by default. When a variable is immutable, once a value is bound to a name, you cant change that value. You can make them mutable by addingmutin front of the variable name.即变量默认不可变一旦值绑定到名字就不能再改变它通过在变量名前添加mut关键字可以让变量变为可变。这一设计是 Rust 内存安全承诺的重要组成部分不可变性消除了某个值在读取时被其他代码意外修改这一类竞态与逻辑错误让编译器可以在编译期就拒绝大量不安全的改写。需要说明的是不可变针对的是绑定binding本身变量名不能再被重新赋值而非该值内部的字段不可修改。真正的运行时只读约束需要借助const见后文或引用类型来实现。用let声明变量类型推断与类型注解Rust 使用let关键字创建新的变量绑定形式为let x 5; // 类型由编译器推断 let y: i32 42; // 显式类型注解类型推断当没有显式注解时Rust 会根据右侧的值推断类型。整数字面量的默认类型是i32类型注解可以在变量名后加: 类型显式指定例如let x: u8 42;。当需要非默认类型或编译器无法推断时注解必不可少。这一点在 variables2 的官方解答中有明确注释solutions/01_variables/variables2.rslet x 42; // 不注解时Rust 推断为默认的 i32 // let x: u8 42; // 也可以显式注解为其他整数类型未初始化变量不可使用Rust 禁止读取未初始化的变量。variables3 要求你给let x: i32;赋一个值否则编译器会直接报错——这是读取不存在的值这类 bug 在编译期被拦截的典型例子。官方解答solutions/01_variables/variables3.rs还展示了一种合法用法先声明、后初始化但初始化前绝不能使用let y: i32; // 先声明 y 42; // 后赋值 println!(Number {y}); // 此时才可读取用mut让变量可变如果确实需要修改变量绑定的值需要在let后加上mut关键字let mut x 3; x 5; // 合法x 是可变的variables4 正是这一知识点的实战原练习中let x 3;之后紧跟着x 5;的重新赋值编译必然失败。正确答案只需要把声明行改为let mut x 3;solutions/01_variables/variables4.rs。变量练习对应的提示文件 rustlings-macros/info.toml 也直白地指出Rust 中变量绑定默认不可变要重新赋值就必须使用mut。经验法则仅在明确需要改写绑定的场景下使用mut默认保持不可变能让代码的意图更清晰也让编译器替你检查更多潜在问题。遮蔽Shadowing同名变量的重新声明mut解决的是改变值但有些场景你其实想要的是一个新的、不同类型的同名变量。Rust 提供了一种更强大的机制遮蔽shadowing——用let重新声明一个同名变量新绑定会遮蔽旧的且允许改变类型。variables5 就是为练习遮蔽而设计的一开始number是字符串T-H-R-E-E随后又要让number参与整数运算number 2。直接改成mut没有意义因为类型不匹配。官方解法solutions/01_variables/variables5.rs是let number T-H-R-E-E; println!(Spell a number: {number}); let number 3; // 遮蔽同名新绑定类型从 str 变成 i32 println!(Number plus two is: {}, number 2);info.toml中的提示rustlings-macros/info.toml特别强调了遮蔽的适用场景当你只是想把值转换成不同类型、或想复用已有变量名时遮蔽比mut更合适。遮蔽与mut的关键区别维度mut可变绑定遮蔽shadowing关键字let mut再次使用let声明同名变量是否允许换类型不允许类型一旦推断即固定允许新绑定可以有全新类型生命周期同一绑定持续到作用域结束新绑定创建后旧绑定不可见典型场景修改同一类型的值类型转换、复用变量名常量Constants用const声明除了变量Rust 还有常量。variables6 引入了这一概念info.toml中的提示rustlings-macros/info.toml总结了常量与变量的核心区别常量用const声明而不是let常量永远不可变不存在mut版本常量的类型必须显式注解不能省略常量可以声明在任何作用域包括全局并且必须在编译期就能确定值。官方解答solutions/01_variables/variables6.rsconst NUMBER: u64 3; // 类型注解是必需的 fn main() { println!(Number: {NUMBER}); }变量与常量的对比维度变量let常量const关键字let/let mutconst可变性默认不可变可用mut开启永远不可变类型注解可省略类型推断必须显式注解声明位置函数体内等局部作用域任意作用域常用于全局值确定时机运行时绑定编译期常量逐题通关variables1 ~ variables6 完整指南Rustlings 中01_variables 目录下的 6 个练习均为test false的编译型练习见 rustlings-macros/info.toml即只需要让代码通过编译即可。下面逐题说明修复思路与官方答案。variables1补上let关键字原代码exercises/01_variables/variables1.rs中x 5;缺少声明关键字。提示指出在main中创建新变量绑定需要一个关键字。解法是在x 5;前补上letfn main() { let x 5; println!(x has the value {x}); }variables2初始化变量以解决类型推断失败原代码exercises/01_variables/variables2.rs中let x;之后直接参与x 10的比较编译器无法推断x的类型。提示引导你思考三种方案加类型注解、给x赋值、或者两者都做。最简解法是直接初始化let x 42; // 推断为 i32与 10 同类型也可以显式注解let x: u8 42;。关键点是x的类型必须与10可比同为整数类型。variables3给变量赋值后才能使用原代码exercises/01_variables/variables3.rs声明了let x: i32;却从未赋值就打印。解法let x: i32 42;。如前面所述也可以先声明后赋值但绝不能在使用前保持未初始化。variables4用mut允许重新赋值原代码exercises/01_variables/variables4.rs中x 5;是不要修改这一行的重新赋值所以只能改声明行let mut x 3;variables5用遮蔽完成类型转换原代码exercises/01_variables/variables5.rs要求不改变变量名地修复编译错误且不能用mut类型不同。解法是遮蔽let number T-H-R-E-E; let number 3; println!(Number plus two is: {}, number 2);variables6为常量补上类型注解原代码exercises/01_variables/variables6.rs中const NUMBER 3;缺少类型注解。解法const NUMBER: u64 3;类型可以换成其他整数类型如i32但注解本身不可省略。在 Rustlings 中运行与验证这些练习属于编译通过即算完成的类型不包含#[test]断言。在仓库根目录下# 进入下一道练习变量系列从 variables1 开始 rustlings next # 运行当前练习并检查是否正确 rustlings run # 或直接指定练习运行 rustlings run variables1当代码通过编译后rustlings run会给出成功提示并自动进入下一题。想对照标准答案可以直接查看 solutions/01_variables/ 目录下对应的同名文件每份答案都附有解释性注释是复习知识点的最佳素材。小结Rust 变量默认不可变这是语言层面的安全设计需要改写绑定时用let mut需要换类型或复用名字时用let遮蔽需要编译期确定的全局不可变值时用const且必须写类型注解未初始化变量不可读取编译器会在编译期拦截这类错误。Rustlings 的变量练习与官方文档 The Rust Book 的 §3.1 Variables and Mutability对应关系见 exercises/README.md 的练习章节映射表一一对应。完成这一组练习后你将具备编写正确、地道的 Rust 变量代码的基础能力。【免费下载链接】rustlings:crab: Small exercises to get you used to reading and writing Rust code!项目地址: https://gitcode.com/gh_mirrors/ru/rustlings创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考