没有合适的资源?快使用搜索试试~ 我知道了~
首页Rust编程语言中文版权威指南
Rust编程语言中文版权威指南
需积分: 0 0 下载量 182 浏览量
更新于2024-06-20
收藏 7.18MB PDF 举报
Rust程序设计语言中文版是一本由Steve Klabnik、Carol Nichols和Rust社区贡献者共同编写的编程教材,专注于介绍Rust这门高性能系统级编程语言。中文翻译参考了Rust 1.58.0版本及其开发版,确保内容的准确性。本书是目前网络上最新的中文译本,于2022年2月6日进行了最后一次更新。 Rust的设计目标是结合C语言的性能与Python般的内存安全,强调所有权模型和零成本抽象,帮助开发者编写更可靠、高效的代码。《Rust权威指南》这个中文出版名称体现了其在业界的地位。早期的中文翻译工作是由Kaiser Y完成的部分,后来的翻译团队将利用这部分成果,并根据官方英文版进行同步更新。 Rust中文版文档提供中英文对照,用户可以在右上角的语言图标间切换,方便学习。在线文档地址是https://rustwiki.org/zh-CN/book/(英文版则为https://doc.rust-lang.org/stable/book/)。对于离线阅读,通过rustup工具安装Rust后,可以获取包含英文版的文档,而中文离线版可通过下载中文翻译GitHub仓库自行生成。 除了在线文档,读者还可以购买NoStarch Press出版的纸质版和电子版书籍,中文版名为《Rust权威指南》,在各大购书平台有售。整个翻译项目鼓励社区参与,用户可以通过编辑功能帮助改进文档质量,共同推动Rust中文资源的发展。在阅读时,建议读者使用至少Rust 1.58版本,如需安装或升级,可在第1章的"安装"部分找到指导。
资源详情
资源推荐
Rust 程序设计语言 中文版
16 / 457
编写猜数字游戏
让我们一起动手完成一个项目,来快速上手 Rust!本章将介绍 Rust 中一些常用概念,并向你展示如何在
实际项目中运用它们。你将会学到
let
、
match
、方法、关联函数、引用外部 crate 等知识!后续章节会
深入探讨这些概念的细节。在本章,我们将做基础练习。
我们会实现一个经典的新手编程问题:猜数字游戏。这是它的工作原理:程序会随机生成一个 1 到 100 之
间的整数。接着它会提示玩家猜一个数并输入,然后指出猜测是大了还是小了。如果猜对了,它会打印祝
贺信息并退出。
创建一个新项目
要创建一个新项目,请进入你在第 1 章中所创建的 projects 目录,使用 Cargo 新建一个项目,如下:
第一个命令
cargo new
,把项目的名称(
guessing_game
)作为第一个参数。第二个命令进入到新创建的
项目目录。
看看生成的 Cargo.toml 文件:
文件名:Cargo.toml
正如第 1 章那样,
cargo new
为你生成了一个 “Hello, world!” 程序。查看 src/main.rs 文件:
文件名:src/main.rs
现在使用
cargo run
命令,一步完成 “Hello, world!” 程序的编译和运行:
当你需要在项目中快速迭代时,
run
命令就能派上用场,正如我们在这个游戏项目中做的,在下一次迭代
之前快速测试每一次迭代。
重新打开 src/main.rs 文件。我们将会在这个文件中编写全部的代码。
$ cargo new guessing_game
$ cd guessing_game
[package]
name = "guessing_game"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-
lang.org/cargo/reference/manifest.html
[dependencies]
fn main() {
println!("Hello, world!");
}
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 1.50s
Running `target/debug/guessing_game`
Hello, world!
Rust 程序设计语言 中文版
17 / 457
处理一次猜测
猜数字程序的第一部分请求用户输入,处理该输入,并检查输入是否符合预期格式。首先,我们将允许玩
家输入猜测。在 src/main.rs 中输入示例 2-1 中的代码。
文件名:src/main.rs
示例 2-1:获取用户猜测并打印的代码
这些代码包含很多信息,让我们一行一行地过一遍。为了获取用户输入并打印结果作为输出,我们需要引
入
io
输入/输出库到当前作用域。
io
库来自于标准库,标准库也被称为
std
:
默认情况下,Rust会将少量标准库中定义的程序项(item)引入到每个程序的作用域中。这些项称作
prelude,可以在标准库文档中了解到关于它的所有知识。
如果需要的类型不在 prelude 中,你必须使用
use
语句显式地将其引入作用域。
std::io
库提供很多有
用的功能,包括接收用户输入的功能。
如第 1 章所提及,
main
函数是程序的入口点:
fn
语法声明了一个新函数,小括号
()
表明没有参数,大括号
{
作为函数体的开始。
正如你在第 1 章中学到的,
println!
是一个在屏幕上打印字符串的宏:
这段代码打印一个提示,介绍游戏的内容并请求用户输入。
使用变量存储值
接下来,创建一个储存用户输入的变量(variable),像这样:
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
Rust 程序设计语言 中文版
18 / 457
现在程序开始变得有意思了!这一小行代码发生了很多事。我们使用
let
语句来创建变量。这里是另外一
个例子:
这行代码新建了一个叫做
apples
的变量并把它绑定到值
5
上。在 Rust 中,变量默认是不可变的。我们
将会在第 3 章的 “变量与可变性”章节详细讨论这个概念。想要让变量可变,可以在变量名前添加
mut
(mutability,可变性):
注意:
//
语法开始一个注释,持续到行尾。Rust 忽略注释中的所有内容,第 3 章将会详细介绍注
释。
回到猜数字程序中,现在我们知道了
let mut guess
会引入一个叫做
guess
的可变变量。等号(
=
)告
诉 Rust 现在想将某个值绑定在变量上。等号的右边是
guess
所绑定的值,它是
String::new
的结果,
这个函数会返回一个
String
的新实例。
String
是标准库提供的字符串类型,是一个 UTF-8 编码的可增
长文本。
::new
那一行的
::
语法表明
new
是
String
类型的一个关联函数。关联函数(associated function)是
实现一种特定类型的函数,在这个例子中类型是
String
。这个
new
函数创建了一个新的空字符串。你会
在很多类型上找到一个
new
函数,因为它是创建类型实例的惯用函数名。
总的来说,
let mut guess = String::new();
这一行创建了一个可变变量,目前它绑定到一个新的
String
空实例上。呼!
接收用户输入
回忆一下,我们在程序的第一行使用
use std::io;
从标准库中引入了输入/输出功能。现在我们可以从
io
模块调用
stdin
函数,这将允许我们处理用户输入:
如果程序的开头没有使用
use std::io
引入
io
库,我们仍可以通过
std::io::stdin
来调用函数。
stdin
函数返回一个
std::io::Stdin
的实例,这是一个类型,代表终端标准输入的句柄。
接下来,
.read_line(&mut guess)
这一行调用了
read_line
方法,来从标准输入句柄中获取用户输
入。我们还将
&mut guess
作为参数传递给
read_line()
,以告诉它在哪个字符串存储用户输入。
read_line
的全部工作是,将用户在标准输入中输入的任何内容都追加到一个字符串中(而不会覆盖其内
容),所以它需要字符串作为参数。这个字符串应是可变的,以便该方法可以更改其内容。
&
表示这个参数是一个引用(reference),这为你提供了一种方法,让代码的多个部分可以访问同一处数
据,而无需在内存中多次拷贝。引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的使用引
用。完成当前程序并不需要了解太多细节。现在,我们只需知道就像变量一样,引用默认是不可变的。因
此,需要写成
&mut guess
来使其可变,而不是
&guess
。(第 4 章会更全面地解释引用。)
let apples = 5;
let apples = 5;
// 不可变
let mut bananas = 5;
// 可变
io::stdin()
.read_line(&mut guess)
Rust 程序设计语言 中文版
19 / 457
使用 Result 类型来处理潜在的错误
我们还要继续分析这行代码。虽然我们已经讲到了文本中的第三行,但它仍然是单个逻辑代码行的一部分
(即一行代码中插入了空行)。下一部分是这个方法:
我们完全可以这样写:
但是,一行过长的代码很难阅读,所以最好拆开来写。当你使用
.method_name()
语法调用方法时,用换
行和空格来拆分长代码行通常是明智的。现在让我们来看看这行代码干了什么。
之前提到了
read_line
将用户输入存储到我们传递给它的字符串中,但它也返回一个值——在这个例子中
是
io::Result
。Rust 标准库中有很多名为
Result
的类型:一个通用的
Result
以及在子模块中的特化
版本,比如
io::Result
。
Result
类型是
枚举
(enumerations),通常也写作 enum。枚举类型持有固
定集合的值,这些值被称为枚举的成员(variant)。枚举往往与条件表达式
match
一起使用,
match
是
一种条件语句,在其被执行时,可以方便地匹配不同枚举值来执行不同的代码。
第 6 章将更详细地介绍枚举类型。这些
Result
类型的目的是编码错误处理信息。
Result
的成员是
Ok
和
Err
,
Ok
成员表示操作成功,且
Ok
内部包含成功生成的值。
Err
成员则意味
着操作失败,并且包含失败的前因后果。
Result
类型的值,就像任何类型的值一样,都有为其定义的方法。
io::Result
的实例拥有
expect
方
法。如果
io::Result
实例的值是
Err
,
expect
会导致程序崩溃,并显示传递给
expect
的参数。如果
read_line
方法返回
Err
,则可能是底层操作系统引起的错误结果。如果
io::Result
实例的值是
Ok
,
expect
会获取
Ok
中的值并原样返回,以便你可以使用它。在本例中,这个值是用户输入的字节
数。
如果不调用
expect
,程序也能编译,但会出现警告提示:
Rust 警告我们没有使用
read_line
的返回值
Result
,这表明程序没有处理一个可能发生的错误。
消除警告的正确做法是实际编写错误处理代码,但在这个例子中,我们只希望程序在出现问题时立即崩
溃,因此我们可以直接使用
expect
。你将在第 9 章了解到如何从错误中恢复。
使用 println! 占位符打印值
除了闭合花括号外,目前为止代码中只有一行需要讨论:
.expect("Failed to read line");
io::stdin().read_line(&mut guess).expect("Failed to read line");
$ cargo build
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
warning: unused `Result` that must be used
--> src/main.rs:10:5
|
10 | io::stdin().read_line(&mut guess);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_must_use)]` on by default
= note: this `Result` may be an `Err` variant, which should be handled
warning: `guessing_game` (bin "guessing_game") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.59s
Rust 程序设计语言 中文版
20 / 457
这行代码现在打印了存储用户输入的字符串。里面的
{}
是预留在特定位置的占位符:把
{}
想象成小蟹
钳,可以夹住合适的值。使用
{}
也可以打印多个值:第一对
{}
使用格式化字符串之后的第一个值,第
二对则使用第二个值,依此类推。调用一次
println!
打印多个值看起来像这样:
这行代码会打印出
x = 5 and y = 10
。
测试第一部分代码
让我们来测试下猜数字游戏的第一部分。使用
cargo run
运行:
至此为止,游戏的第一部分已经完成:我们从键盘获取输入并打印了出来。
生成一个秘密数字
接下来,需要生成一个秘密数字,好让用户来猜。秘密数字应该每次都不同,这样重复玩才不会乏味;范
围应该在 1 到 100 之间,这样才不会太困难。Rust 标准库中尚未包含随机数功能。然而,Rust 团队还是
提供了一个包含上述功能的
rand
crate。
使用 crate 来增加更多功能
记住,crate 是一个 Rust 代码包。我们正在构建的项目是一个 二进制 crate,它生成一个可执行文件。
rand
crate 是一个 库 crate,库 crate 可以包含任意能被其他程序使用的代码,但是不能独自执行。
Cargo 对外部 crate 的运用是其真正的亮点所在。在我们使用
rand
编写代码之前,需要修改 Cargo.toml
文件,引入一个
rand
依赖。现在打开这个文件并将下面这一行添加到
[dependencies]
表块标题之下。
请确保按照我们这里的方式指定
rand
及其这里给出的版本号,否则本教程中的示例代码可能无法工作。
文件名:Cargo.toml
在 Cargo.toml 文件中,表头以及之后的内容属同一个表块,直到遇到下一个表头才开始新的表块。在
[dependencies]
表块中,你要告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语
义化版本
0.8.3
来指定
rand
crate。Cargo 理解语义化版本(Semantic Versioning,有时也称为
SemVer),这是一种定义版本号的标准。
0.8.3
实际上是
^0.8.3
的简写,它表示任何至少包含
0.8.3
println!("You guessed: {}", guess);
let x = 5;
let y = 10;
println!("x = {} and y = {}", x, y);
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 6.44s
Running `target/debug/guessing_game`
Guess the number!
Please input your guess.
6
You guessed: 6
rand = "0.8.3"
剩余456页未读,继续阅读
Lucifer_Warlock
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功