没有合适的资源?快使用搜索试试~ 我知道了~
首页Rust编程语言:赋能开发者,提升自信与效率
Rust编程语言:赋能开发者,提升自信与效率
需积分: 12 14 下载量 116 浏览量
更新于2024-07-18
收藏 5.76MB PDF 举报
Rust程序设计语言简体中文版是一本旨在全面介绍Rust语言的书籍,该语言的核心理念是赋能开发者,帮助他们在编程领域特别是系统级编程方面取得更大的成就。Rust通过消除内存管理、数据表示和并发等底层问题中的传统陷阱,提供了一套友好且强大的工具,使得开发者在编写高性能代码时无需担心常见的崩溃或安全漏洞,同时避免了因语言频繁变动带来的学习困扰。 书中强调了Rust在底层系统编程中的应用,比如内存安全的并发处理,编译器能够自动检测和防止常见的错误,鼓励开发者进行积极的性能优化,同时保持代码的稳定性和可靠性。此外,Rust的广泛适用性不仅限于系统编程,它的表达能力和效率使得编写命令行接口(CLI)应用、Web服务乃至嵌入式开发成为可能。 本书以易于理解的方式深入讲解Rust,目标是提升读者对Rust的理解和信心,无论是经验丰富的程序员还是刚接触该领域的初学者都能从中受益。作者Nicholas Matsakis和Aaron Turon强调,阅读这本书意味着打开了一个全新的世界——Rust社区的大门,邀请读者一同探索Rust的世界,利用它在不同编程场景中扩展技能,如从编写Web应用到驾驭Raspberry Pi等。 无论是对于寻求系统级编程能力提升的开发者,还是希望尝试新技术的工程师,这本Rust教程都是一个理想的起点,它不仅提供了理论知识,还通过实际案例展示了如何在实践中应用Rust。通过阅读这本书,读者不仅能掌握Rust语言的基础,还能了解到如何利用它在现代软件开发中发挥更大的作用。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10870130/bg10.jpg)
0.3.15
和
0.4.0
,在运
cargo update
时会出现如下内容:
这时,你也会注意到的
Cargo.lock
件中的变化外乎现在使的
rand
crate 版本是
如果想要使
0.4.0
版本的
rand
或是任何
0.4.x
系的版本,必须像这样新
下次运
cargo build
时,Cargo 会从 registry 新可的 crate,并根据你指定的新版本重新计算
第四章会讲到
Cargo
及其
态系统
的多内容,过前你只需要解这么多。通过 Cargo 复库
常容,因此 Rustacean 能够编写出由很多包组装成的轻巧的项。
成个随机数
你已经把
rand
crate 添加到
Cargo.toml
,让我们开始
使
rand
吧。下步是新
2-3 所示:
件名: src/main.rs
示 2-3:添加成随机数的代码
先,这在顶部增加
extern crate rand;
通知 Rust 我们要使外部依赖
应的
use rand
,所以现在可以使
rand::
前缀来调
rand
crate 中的任何内容。
接下来增加另
use
:
use rand::Rng
。
Rng
是个 trait,它定义随机数成应实现的法,
想使这些法的话,此 trait 必须在作域中。第章会详细介绍 trait。
另外,中间还新增加两。
rand::thread_rng
函数提供实际使的随机数成:它位于当前执线
程本地,并从操作系统获取 seed。接下来,调随机数成的
gen_range
法。这个法由刚才引
到作域的
Rng
trait 定义。
gen_range
法获取两个数字作为参数,并成个范围在两者之间的随机
数。它包含下限但包含上限,所以需要指定
1
和
101
来请求个 1 和 100 之间的数。
注意:你可能凭空就知道应该 use 哪个 trait 以及该从 crate 中调哪个法。crate 的使说明位
于其档中。Cargo 有个很棒的功能是:运
cargo doc --open
命令来构建所有本地依赖提供
的档,并在浏览中打开。如,假设你对
rand
crate 中的其他功能感兴趣,你可以运
cargo doc --open
并点击左侧导航栏中的
rand
。
$ cargo update
Updating registry `https://github.com/rust-lang/crates.io-index`
Updating rand v0.3.14 -> v0.3.15
[dependencies]
rand
=
"0.4.0"
extern
crate
rand;
use
std::io;
use
rand::Rng;
fn
main
() {
println!
(
"Guess the number!"
);
let
secret_number = rand::thread_rng().gen_range(
1
,
101
);
println!
(
"The secret number is: {}"
, secret_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);
}
Rust 程序设计语⾔ 简体中⽂版 https://kaisery.github.io/trpl-zh-cn/print.html
16 of 345 10/2/18, 12:03 PM
![](https://csdnimg.cn/release/download_crawler_static/10870130/bg11.jpg)
新增加的第代码打印出秘密数字。这在开发程序时很有,因为可以测试它,过在最终版本中会
删掉它。游戏开始就打印出结果就没么可玩的!
尝试运程序次:
你应该能得到同的随机数,同时它们应该都是在 1 和 100 之间的。得漂亮!
较猜测的数字和秘密数字
现在有户输和个随机数,我们可以较它们。这个步骤如示 2-4 所示。注意这段代码还能通
过编译,我们稍后会解释。
件名: src/main.rs
示 2-4:处较两个数字可能的返回值
新代码的第是另个
use
,从标准库引个叫做
std::cmp::Ordering
样,
Ordering
也是个枚举,过它的成员是
Less
、
Greater
和
Equal
。这是较两个值时可能出
现的三种结果。
接着,底部的五新代码使
Ordering
类型,
cmp
法来较两个值并可以在任何可较的值上
。它获取个被较值的引:这是把
guess
与
secret_number
做较。 然后它会返回个刚才
过
use
引作域的
Ordering
枚举的成员。使个
match
表达式,根据对
secret_number
调
cmp
返回的
Ordering
成员来决定接下来做么。
个
match
表达式由
分(arms)
构成。个分包含个
模式
(
pattern
)和表达式开头的值与分
模式相匹配时应该执的代码。Rust 获取提供给
match
的值并挨个检查每个分的模式。
模式是 Rust 中强的功能,它体现代码可能遇到的多种情形,并帮助你确保没有遗处。这些功能
分别在第六章和第章详细介绍。
让我们看看使
match
表达式的。假设户猜 50,这时随机成的秘密数字是 38。较 50 与
时,因为 50 38 要,
cmp
法会返回
Ordering::Greater
。
Ordering::Greater
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 7
Please input your guess.
4
You guessed: 4
$ cargo run
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 83
Please input your guess.
5
You guessed: 5
extern
crate
rand;
use
std::io;
use
std::cmp::Ordering;
use
rand::Rng;
fn
main
() {
// ---snip---
println!
(
"You guessed: {}"
, guess);
match
guess.cmp(&secret_number) {
Ordering::Less =>
println!
(
"Too small!"
),
Ordering::Greater =>
println!
(
"Too big!"
),
Ordering::Equal =>
println!
(
"You win!"
),
}
}
Rust 程序设计语⾔ 简体中⽂版 https://kaisery.github.io/trpl-zh-cn/print.html
17 of 345 10/2/18, 12:03 PM
![](https://csdnimg.cn/release/download_crawler_static/10870130/bg12.jpg)
得到的值。它检查第个分的模式,
Ordering::Less
与
Ordering::Greater
这个分的代码并来到下个分。下个分的模式是
Ordering::Greater
,
联的代码被执,在屏幕打印出
Too big!
。
match
表达式就此终,因为该场景下没有检查最后个
的必要。
然,示 2-4 的代码并能编译,可以尝试下:
错误的核表明这有
匹配的类型
(
mismatched types
)。Rust 有个静态强类型系统,同时也有类
推断。当我们写出
let guess = String::new()
时,Rust 推断出
guess
应该是
要我们写出类型。另,
secret_number
,是数字类型。个数字类型拥有 1 到 100 之间的值:32
位数字
i32
;32 位符号数字
u32
;64 位数字
i64
等等。Rust 默认使
i32
secret_number
的类型,除增加类型信息,或任何能让 Rust 推断出同数值类型的信息。这错误的
原因在于 Rust 会较字符类型和数字类型。
所以我们必须把从输中读取到的
String
转换为个真正的数字类型,才好与秘密数字进较。这可
以通过在
main
函数体中增加如下两代码来实现:
件名: src/main.rs
这两新代码是:
这创建个叫做
guess
的变。过等等,是已经有个叫做
guess
的变吗?确实如此,
过 Rust 允许个新值来
隐藏
(
shadow
)
guess
之前的值。这个功能常在需要转换值类型之类的
场景。它允许我们复
guess
变的名字,是被迫创建两个同变,诸如
之类。(第三章会介绍 shadowing 的多细节。)
我们将
guess
绑定到
guess.trim().parse()
表达式上。表达式中的
guess
是包含输的原始
类型。
String
实的
trim
法会去除字符开头和结尾的空字符。
u32
只能由数字字符转换,
户必须输
return
键才能让
read_line
返回,然户按下
return
键时,会在字符中增加个换
(newline)符。如,户输
5
并按下
return
,
guess
看起来像这样:
5\n
。
键。
trim
法消除
\n
,只下
5
。
字符的
parse
法
将字符解析成数字。因为这个法可以解析多种数字类型,因此需要告诉 Rust
$ cargo build
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
error[E0308]: mismatched types
--> src/main.rs:23:21
|
23 | match guess.cmp(&secret_number) {
| ^^^^^^^^^^^^^^ expected struct `std::string::String`, found
integral variable
|
= note: expected type `&std::string::String`
= note: found type `&{integer}`
error: aborting due to previous error
Could not compile `guessing_game`.
// --snip--
let
mut
guess =
String
::new();
io::stdin().read_line(&
mut
guess)
.expect(
"Failed to read line"
);
let
guess:
u32
= guess.trim().parse()
.expect(
"Please type a number!"
);
println!
(
"You guessed: {}"
, guess);
match
guess.cmp(&secret_number) {
Ordering::Less =>
println!
(
"Too small!"
),
Ordering::Greater =>
println!
(
"Too big!"
),
Ordering::Equal =>
println!
(
"You win!"
),
}
}
let
guess:
u32
= guess.trim().parse()
.expect(
"Please type a number!"
);
Rust 程序设计语⾔ 简体中⽂版 https://kaisery.github.io/trpl-zh-cn/print.html
18 of 345 10/2/18, 12:03 PM
![](https://csdnimg.cn/release/download_crawler_static/10870130/bg13.jpg)
体的数字类型,这通过
let guess: u32
指定。
guess
后的冒号(
:
)告诉 Rust 我们指定变
类型。Rust 有些内建的数字类型;
u32
是个符号的 32 位整型。对于的正整数来说,它是错
的类型,第三章还会讲到其他数字类型。另外,程序中的
u32
注解以及与
secret_number
着 Rust 会推断出
secret_number
也是
u32
类型。现在可以使相同类型较两个值!
parse
调很容产错误。如,字符中包含
A👍 %
,就法将其转换为个数字。因此,
法返回个
Result
类型。像之前 “使
Result
类型来处潜在的错误” 讨论的
再次按部就班的
expect
法处即可。如果
parse
能从字符成个数字,返回个
Result::Err
时,
expect
会使游戏崩溃并打印附带的信息。如果
parse
成功地将字符转换为个数
字,它会返回
Result::Ok
,然后
expect
会返回
Ok
中的数字。
现在让我们运程序!
漂亮!即是在猜测之前添加空格,程序依然能判断出户猜测 76。多运程序次,输同的
字来检验同的为:猜个正确的数字,猜个过的数字和猜个过的数字。
现在游戏已经体上能玩,过户只能猜次。增加个循环来改变它吧!
使循环来允许多次猜测
loop
关键字创建个限循环。将其加后,户可以反复猜测:
件名: src/main.rs
如上所示,我们将提示户猜测之后的所有内容放循环。确保 loop 循环中的代码多缩进四个空格,
次运程序。注意这有个新问题,因为程序忠实地执我们的要求:永远地请求另个猜测,户
好像没法退出啊!
户总能使
ctrl-c
终程序。过还有另个法跳出限循环,就是 “较猜测与秘密数字” 部分提到
的
parse
:如果户输的答案是个数字,程序会崩溃。户可以这点来退出,如下所示:
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 0.43 secs
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 58
Please input your guess.
76
You guessed: 76
Too big!
// --snip--
println!
(
"The secret number is: {}"
, secret_number);
loop
{
println!
(
"Please input your guess."
);
// --snip--
match
guess.cmp(&secret_number) {
Ordering::Less =>
println!
(
"Too small!"
),
Ordering::Greater =>
println!
(
"Too big!"
),
Ordering::Equal =>
println!
(
"You win!"
),
}
}
}
Rust 程序设计语⾔ 简体中⽂版 https://kaisery.github.io/trpl-zh-cn/print.html
19 of 345 10/2/18, 12:03 PM
![](https://csdnimg.cn/release/download_crawler_static/10870130/bg14.jpg)
输
quit
确实退出程序,同时其他任何数字输也样。然,这并想,我们想要当猜测正确
的数字时游戏能动退出。
猜测正确后退出
让我们增加个
break
,在户猜对时退出游戏:
件名: src/main.rs
通过在
You win!
之后增加
break
,户猜对神秘数字后会退出循环。退出循环也意味着退出程
序,因为循环是
main
的最后部分。
处效输
为进步改善游戏性,要在户输数字时崩溃,需要忽数字,让户可以继续猜测。可以通
过修改
guess
将
String
转化为
u32
那部分代码来实现,如示 2-5 所示:
件名: src/main.rs
$ cargo run
Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
Finished dev [unoptimized + debuginfo] target(s) in 1.50 secs
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 59
Please input your guess.
45
You guessed: 45
Too small!
Please input your guess.
60
You guessed: 60
Too big!
Please input your guess.
59
You guessed: 59
You win!
Please input your guess.
quit
thread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit
}', src/libcore/result.rs:785
note: Run with `RUST_BACKTRACE=1` for a backtrace.
error: Process didn't exit successfully: `target/debug/guess` (exit code: 101)
// --snip--
match
guess.cmp(&secret_number) {
Ordering::Less =>
println!
(
"Too small!"
),
Ordering::Greater =>
println!
(
"Too big!"
),
Ordering::Equal => {
println!
(
"You win!"
);
break
;
}
}
}
}
// --snip--
io::stdin().read_line(&
mut
guess)
.expect(
"Failed to read line"
);
let
guess:
u32
=
match
guess.trim().parse() {
Ok
(num) => num,
Err
(_) =>
continue
,
};
println!
(
"You guessed: {}"
, guess);
// --snip--
Rust 程序设计语⾔ 简体中⽂版 https://kaisery.github.io/trpl-zh-cn/print.html
20 of 345 10/2/18, 12:03 PM
剩余344页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/8f79738aa3f246faaa0a54a80af2ec65_u010471598.jpg!1)
msyfls123
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 贵州煤矿矿井水分类与处理策略:悬浮物、酸性与非酸性
- 醛固酮增多症肾上腺静脉采样对比:ACTH后LR-CAV的最优评估
- 开源云连接传感器监控平台:农业土壤湿度远程监测
- 母婴用品企业年度生产计划线性规划优化模型:实证与应用
- 井下智能变电站:Rogowski线圈电流检测系统的研发与性能验证
- 霍州矿区煤巷稳定性分析及支护策略
- ARM嵌入式系统远程软件更新方案:基于TFTP协议
- 煤炭选煤中汞分布规律与洗选脱汞效果
- 提升码垛机器人性能:拉格朗日动力学模型与滑模模糊控制的应用
- 增强现实技术提升学前手写教学:设计与开发案例
- 不规则工作面沉陷三角剖分算法提升与应用
- 卡尔曼滤波在瞬变电磁干扰压制中的应用研究
- 煤矿安全能力研究:理论与系统构建
- LonWorks总线技术在斜巷运输车辆定位与跑车防护中的应用
- 神东煤炭集团高效煤粉锅炉系统:节能环保新实践
- Ti/SnO2+Sb2Ox/PbO2电极分形维数与电催化性能研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)