ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Rust入门先跑起来:5行代码写出第一个可执行程序

Rust入门先跑起来:5行代码写出第一个可执行程序 如果你搜过“Rust入门”前几屏大概率会看到所有权、借用、生命周期这些词再往后翻连“移动语义”和“借用检查器”都出来了很多人到这一步直接关掉浏览器心想这语言也太难了。我见过太多人卡在第一章就放弃挺可惜的——因为Rust真正让人上瘾的地方是你亲手跑通第一个可执行程序那一刻的成就感。今天我不聊所有权也不谈生命周期咱们先用5行代码写一个能跑的Rust程序。你先让它跑起来体会到“这玩意儿真能干活”的感觉再回头去啃那些理论心态会完全不一样。这篇文章适合所有被所有权劝退的新手、以及想快速验证Rust到底怎么回事的开发者照着敲一遍五分钟就能看到结果。1. 为什么我劝你别一上来就啃所有权1.1 所有权不是Rust入门的第一块敲门砖很多教程把所有权放在最前面理由是“它是Rust最核心的特性”。这话没错但教法有问题。你想想学开车的时候教练不会第一天就让你拆发动机讲曲轴原理而是先让你坐进驾驶座点火挂挡把车开出去转一圈。等你对方向盘、油门、刹车有了肌肉记忆再让你打开引擎盖认识一下各个部件效果才会好。所有权就是Rust的发动机你得先摸到方向盘才有理解它的动力。拿我自己举例最早看Rust文档时光是“String和str的区别”就反复读了好几遍每次看到“移动”这个说法就迷糊脑子里全是C里拷贝构造和析构函数的影子越比越乱。后来我换了个路子先照着示例写了几个能跑的小程序管它什么所有权先让它编译通过再说。等我真的开始写一个需要保存用户输入、再传给函数处理的程序时编译器给我报了一堆错这个时候我再翻所有权那一章瞬间就通了。所以我现在的观点很明确第一堂Rust课就该是“5行代码写一个可执行程序”。所有权不是上手前的门槛而是你写了几十行、上百行代码之后自然遇到的需求。它负责解决的问题是“内存安全”而你在写Hello World的时候根本不需要考虑内存释放那提前学它纯粹是给自己加戏。1.2 “先跑起来再学理论”这条路径的三大好处先建立正反馈这是最重要的一点。人都是需要即时奖励的你花半小时配环境、写代码、编译最后屏幕上蹦出一行输出这个“成了”的感觉比看十页理论都管用。反过来如果你花了两小时读所有权合上书一片茫然那种挫败感会直接劝退你。其次是降低认知负担。学习任何新东西最好的一次只引入一个新概念。你第一遍写Rust只需要知道“有这个语言、有这个工具链、代码长这样”就够了。等你适应了语法风格再接触所有权、生命周期这些抽象概念大脑才有空间去处理。很多人觉得Rust难不是它真的难而是他把所有难点全堆在开头一起消化换谁也扛不住。第三个好处很实际Rust的编译器报错信息本身就是一个很好的老师。你写一个简单程序编译器不会给你报所有权的错它就报一些很基础的错误比如缺分号、变量没声明。你在调试这些低级错误的过程中会慢慢熟悉Rust编译器的风格和脾气。等到后面你真的碰到借用检查的报错时你已经习惯看这些红色提示了不会一看到就心慌。2. 5行代码快速实现你的第一个Rust可执行程序2.1 环境准备装好Rust工具链写代码之前先把工具链搞定。Rust官方推荐的安装方式是rustup它既是版本管理器也是工具链安装器。在macOS或Linux上打开终端执行curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh它会下载脚本并交互式询问安装方式直接回车选默认的stable版本就行。装完之后把环境变量加载到当前shellsource $HOME/.cargo/envWindows用户直接去 Rust官网 下载rustup-init.exe双击运行默认选项一路下一步就完事。有一点需要注意Windows上编译Rust程序需要链接器官方推荐安装Visual Studio Build Tools勾选“使用C的桌面开发”工作负载。如果不想装Visual Studio那么大个东西也可以装微软提供的Build Tools独立版反正得有MSVC链接器否则后面编译会报link.exe not found。装完后验证一下环境是否正常终端里执行rustc --version cargo --versionrustc是Rust编译器cargo是包管理和构建工具两个都输出版本号就说明OK了。编辑器方面我推荐VS Code配合rust-analyzer插件它对代码补全、错误提示的支持做得非常到位装完插件打开一个Rust文件就能用。2.2 逐行拆解这5行代码环境就绪后先别急着敲命令我们来聊聊这5行代码本身。找一个你喜欢的工作目录新建一个文件叫main.rs——.rs是Rust源码的标准后缀名打开它敲入下面内容fn main() { let name Rust; println!(Hello, {}!, name); let sum 3 4; println!(3 4 {}, sum); }你别看这5行简单里面的信息量其实不小。第一行是fn main()这是程序的入口点相当于C语言的main函数也相当于绝大多数脚本语言从第一行开始执行的那个起点。Rust规定可执行程序必须有一个main函数哪怕你写一万行代码程序也是从这里开始跑的。第二行let name Rust;声明了一个变量let关键字就是Rust里定义变量的方式。这里有个细节Rust里的变量默认是不可变的也就是说这段代码里name一旦绑定到Rust这个值后面就不能再给它赋新值了。如果你试图写name Go编译器立刻会报错。这个设计就是为了让代码更容易推理但在目前这个阶段你只需要知道“用let声明变量、变量默认不能改”就够了。第三行println!(Hello, {}!, name);是向屏幕打印一行文字。注意println!后面带了一个感叹号说明它是一个宏不是普通函数。{}是一个占位符运行时会把后面传入的name变量的值替换进去。你还能在字符串里写多个{}然后依次传入多个参数Rust会按顺序填充。第四行let sum 3 4;是声明另一个变量同时执行了一个加法运算。Rust编译器非常聪明它会在编译阶段就算出3 4的结果但写成这样能让你看到“变量可以存储计算结果”这一层含义。第五行println!(3 4 {}, sum);把计算结果打印出来。运行这个程序你会在终端里看到两行输出Hello, Rust!和3 4 7。整个过程中你没有看到任何一个跟所有权沾边的概念程序照常运行结果正确。这就证明了Rust完全可以先用起来再慢慢深入本质。2.3 编译与运行的完整流程写完代码之后怎么把它变成可执行程序这里我建议你别直接拿rustc编译而是从第一步就习惯用cargo管理项目。cargo是Rust官方的构建工具它帮你处理依赖下载、编译参数、项目结构这些杂事长远来看能省你大量时间。用cargo新建一个项目cargo new hello_rust cd hello_rust这个命令会生成一个完整的项目骨架目录结构长这样hello_rust/ ├── Cargo.toml └── src/ └── main.rsCargo.toml是项目配置文件记录项目名称、版本、依赖信息src/main.rs就是你的源码文件。cargo已经帮你生成了一段默认的Hello World代码你直接把我们那5行代码替换到src/main.rs里保存文件然后执行cargo runcargo run会先编译再执行生成的二进制文件。第一次运行的时候它需要编译标准库的依赖会稍微慢一点之后增量编译就快很多。你应该会在终端看到两行输出Hello, Rust! 3 4 7如果你想单独编译而不运行可以用cargo build。编译好的可执行文件在target/debug/目录下Linux和macOS上文件名就是hello_rustWindows上是hello_rust.exe。你可以直接运行这个文件跟其他编程语言编译出来的程序没有区别。发布时用cargo build --release编译器会做大量优化生成的程序跑起来快得多但编译时间也更长。提示cargo run和cargo build是入门阶段用得最多的两个命令。每修改一次代码存盘之后重新cargo run就能看到新结果整个过程非常顺滑。3. 从5行到50行不碰所有权也能写的实用代码3.1 扩展方向一接收用户输入光会打印固定字符串很快就没意思了。我们升级一下写一个跟用户有交互的程序。比如让用户输入自己的名字然后程序跟他打个招呼。新建一个main.rs敲入下面内容use std::io; fn main() { println!(请输入你的名字:); let mut name String::new(); io::stdin().read_line(mut name).expect(读取输入失败); println!(你好, {}!, name.trim()); }这段代码你看起来可能会有点陌生尤其是let mut name和mut name。我先把话说清楚这里的mut表示这个变量是可变的因为read_line需要在运行时往name字符串里追加内容所以必须用mut标记。mut name是可变引用这确实涉及到所有权体系里的借用概念但你现在不需要深入理解你只需要知道“我要调用的这个函数需要传一个可以进行修改的字符串进去”照这个写法写就行。等你把这段代码跑起来输入几个不同名字试试再想想如果不加mut编译器会报什么错——你就能直观地感受到为什么Rust要区分可变和不可变。这是一个很好的“先遇到问题再理解概念”的例子。运行效果请输入你的名字: Alice 你好, Alice!3.2 扩展方向二循环与条件判断接下来写一个带循环的程序让代码真正“活”起来。比如一个从1数到10、只打印偶数的程序fn main() { for i in 1..10 { if i % 2 0 { println!({} 是偶数, i); } } }1..10表示从1到10的闭区间包含10。for i in ...就是遍历这个范围内的每一个数i % 2 0是判断偶数的条件。这段逻辑你换成Python、JavaScript、Java写结构几乎一样没有任何Rust独有的高级概念。你还可以试着改改代码比如改成只打印能被3整除的数或者把范围改成1..100顺手体验一下Rust的编译速度。这种“小步改动、立即运行”的练习方式对新手建立手感特别有帮助。3.3 扩展方向三文件读写我们再上一个台阶写一个真实场景里一定会用到的东西文件操作。下面的程序创建一个文件写入一行文字然后再读出来打印到屏幕上use std::fs; fn main() { fs::write(hello.txt, 你好, Rust 文件操作).expect(写入文件失败); let content fs::read_to_string(hello.txt).expect(读取文件失败); println!(文件内容: {}, content); }整个程序体量不大但背后有信息量。fs::write会直接覆写文件内容如果文件不存在就创建它。fs::read_to_string把整个文件内容读成一个字符串。两个调用都返回一个Result类型expect的作用是“如果出错就直接panic把错误信息打出来”。运行一次你会发现不仅终端输出了文件内容当前目录下还多了一个hello.txt文件。这不是什么巧妙的小把戏而是Rust標準库的力量——它自带一整套完善的文件、网络、线程、时间等标准模块所以你不依赖第三方库就能写很多实用的工具程序。到这里你已经可以写出能交互、能循环、能操作文件的程序了。这距离“可以做点正经事情”的Rust程序只差一步但你依然没有系统地学习过所有权。这说明一个道理所有权是Rust的高级特性不是使用Rust的前提条件。4. 新手常见报错与排查技巧实录4.1 编译报错速查表写Rust程序编译报错太常见了不用怕。我把新手最容易遇到的几个报错整理成了表格你照着排查就行。报错信息简化出现原因解决方案expected ;语句末尾忘记加分号在报错行末尾补上分号cannot find value name in this scope变量名拼错或未声明检查变量名是否一致mismatched types类型不匹配比如把字符串当数字用检查赋值或传参的类型expectedstr, found structStringstr和String混用用s或to_string()做转换use of moved value访问了已经移动的变量这通常是所有权问题先复制或借用the trait bound is not satisfied泛型约束不满足检查是否缺少use std::...导入前四个错误在你学习初期最常遇到后面两个等你写复杂程序才会碰到。关键是别把这些报错当成“失败”要当成编译器在帮你做代码审查。4.2 工具链问题排查除了代码本身新手还会遇到环境配置的问题。常见的一个是执行cargo命令时报command not found这通常是安装后没有重新打开终端或者没有加载环境变量。Linux和macOS上试试source $HOME/.cargo/envWindows上重新开一个PowerShell窗口。另一个典型问题是VS Code的rust-analyzer不生效。如果你装完插件还是不提示补全、不显示错误多半是插件没有找到工具链。在VS Code设置里搜索rust-analyzer相关的可执行路径确认它指向rust-analyzer对应的可执行文件。大多数情况下重新加载窗口能解决90%的插件抽风问题。Windows用户还会遇到编译时link.exe not found的错误本质就是缺少MSVC链接器。解决办法我前面提过安装Visual Studio Build Tools。如果你用的是GNU工具链需要把默认工具链切到GNU版本rustup default stable-x86_64-pc-windows-gnu。不过还是建议用MSVC因为它兼容性和性能整体更好。4.3 心态建设与学习建议最后说点掏心窝子的话。Rust的学习曲线陡峭这是一个事实但“陡峭”不等于“一开始就陡”。根据我自己的经历和带过的新人来看最快的学习路径其实是先写简单的可执行程序保持每天都有代码跑通的正反馈等到出现“多个函数都要操作同一个数据”这种事情时你自然会遇到所有权问题这时候再打开官网那本免费书认真读一遍所有权章节你会有一种“原来如此”的顿悟感。还有一个小建议多利用编译器的报错信息。Rust编译器大概是所有主流语言里最友好的编译器之一它不只告诉你哪行错了还会告诉你该怎么改。甚至有的错误会在help里直接给出示例代码。你把报错信息当成一个耐心的导师每天被它指点几次水平就上去了。我个人在实际操作中的体会是很多初学者被所有权劝退不是因为所有权本身有多难而是他们在没有实际需求的情况下强行去理解抽象概念。就像一个从没开过车的人你跟他讲变速箱齿轮比他当然一头雾水。先让代码跑起来让屏幕上有输出让程序能跟用户对话能操作文件你再回头学所有权一切都会顺理成章。现在就去开一个终端把第一个5行程序跑起来吧。
返回列表