Merge pull request #96 from codemystery/main

修正first-try章节的文字错误和排版`
pull/99/head
Sunface 3 years ago committed by GitHub
commit 2a0b665453
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -180,6 +180,7 @@
- [编译器 todo](compiler/intro.md) - [编译器 todo](compiler/intro.md)
- [常见属性标记](compiler/attributes.md) - [常见属性标记](compiler/attributes.md)
- [优化编译速度](compiler/speed-up.md)
- [标准库解析 todo](std/intro.md) - [标准库解析 todo](std/intro.md)
- [如何寻找你想要的内容](std/search.md) - [如何寻找你想要的内容](std/search.md)

@ -1,33 +1,35 @@
## 认识Cargo ## 认识Cargo
但凡经历过C/C++、Go语言1.10版本之前的用户都知道,一个好的包管理工具有多么的重要!!我们那个时候时如此的羡慕nodejs的npm包管理,但是却求而不得,包管理工具最重要的意义就是**任何用户拿到你的代码,都能运行起来**"而不会因为各种包版本依赖焦头烂额Go语言在1.10版本之前所有的包都是在github.com下存放导致了所有的项目都公用一套依赖代码在本地项目复杂后这简直是一种依赖 但凡经历过C/C++、Go语言1.10版本之前的用户都知道,一个好的包管理工具有多么的重要!!我那个时候是如此的渴望类似`nodejs`的npm包管理工具,但是却求而不得,包管理工具最重要的意义就是**任何用户拿到你的代码,都能运行起来**"而不会因为各种包版本依赖焦头烂额Go语言在1.10版本之前所有的包都是在github.com下存放导致了所有的项目都公用一套依赖代码在本地项目复杂后这简直是一种灾难
说多了都是泪笔者目前还有一个早期Go的项目(15年写的)用到了iris(一个坑爹http服务)结果现在运行不起来了因为找不到iris当时的那个版本 说多了都是泪笔者目前还有一个早期Go的项目(15年写的),用到了`iris`(一个坑爹http服务),结果现在运行不起来了,因为找不到`iris`当时的那个版本!!
作为一门现代化语言,`Rust`吸收了多个语言的包管理优点,为大家提供超级大杀器:`cargo`,真的,但凡用过后,你都不会想要其他语言的包管理工具了 作为一门现代化语言,`Rust`吸收了多个语言的包管理优点,为大家提供超级大杀器:`cargo`,真的,再挑剔的开发者,都对它赞不绝口
总而言之,`cargo`提供了一系列的工具从项目的建立、构建到测试、运行直至部署为Rust项目的管理提供尽可能完整的手段同时与Rust语言及其编译器rustc紧密结合可以说用了后就忘不掉如同那种初恋般的触电感觉。 总而言之,`cargo`提供了一系列的工具从项目的建立、构建到测试、运行直至部署为Rust项目的管理提供尽可能完整的手段同时与Rust语言及其编译器`rustc`紧密结合,可以说用了后就忘不掉,如同初恋般的感觉。
## 创建一个"你好,世界"项目 ## 创建一个"你好,世界"项目
又见"你好,世界",肯定有读者在批评了:你就不能优点创意吗?"世界,你好"不行吗?你是读者,你说了算,好的,那我们来创建一个"世界,你好"。 又见"你好,世界",肯定有读者在批评了:你就不能有点创意吗?"世界,你好"难道不配?你是读者,你说了算,那我们就来创建一个"世界,你好"。
门提到过Rust语言的包管理工具名称叫`cargo`好在我们无需手动安装在之前安装Rust的时候就一起安装了如果你在终端无法使用这个命令考虑一下`环境变量`是否正确的设置,你需要把`cargo`可执行文件所在的目录添加到环境变量中。 文提到Rust语言的包管理工具是`cargo`好在我们无需手动安装在之前安装Rust的时候就一并安装如果你在终端无法使用这个命令考虑一下`环境变量`是否正确的设置:把`cargo`可执行文件所在的目录添加到环境变量中。
在终端输入: 终于到了紧张刺激的new new new环节:
```console ```console
$ cargo new world_hello $ cargo new world_hello
``` ```
上面的命令使用`cargo new`创建了一个项目,项目名是`world_hello`(向读者势力低头的项目名称,泪奔),这个项目的结构和配置文件都是由`cargo`生成,这种结构和配置文件意味着**该项目被cargo所管理**早期的cargo在创建项目时必须添加`--bin`的参数,如下所示: 上面的命令使用`cargo new`创建一个项目,项目名是`world_hello`(向读者势力低头的项目名称,泪奔),该项目的结构和配置文件都是由`cargo`生成,意味着**我们的项目被cargo所管理**。
早期的cargo在创建项目时必须添加`--bin`的参数,如下所示:
```console ```console
$ cargo new world_hello --bin $ cargo new world_hello --bin
``` ```
现在的版本,已经无需这个参数,`cargo`默认就为我们创建`bin`类型的项目顺便说一句rust项目主要分为两个类型bin和lib前者是一个可以运行的项目,后者是一个依赖库项目。 现在的版本,已经无需此参数,`cargo`默认就创建`bin`类型的项目顺便说一句Rust项目主要分为两个类型`bin`和`lib`,前者是一个可运行的项目,后者是一个依赖库项目。
创建的项目结构: 下面来看看创建的项目结构:
```console ```console
. .
├── .git ├── .git
@ -38,15 +40,13 @@ $ cargo new world_hello --bin
``` ```
是的连git都给你创建了比小棉袄还体贴。 是的连git都给你创建了不仅令人感叹,不是女儿,胜似女儿,比小棉袄还体贴。
## 运行项目 ## 运行项目
有两种方式可以运行我们的项目,先来看看第一种 有两种方式可以运行项目,先来看看第一种.
#### cargo run #### cargo run
一码胜似千言:
真的很简单,我就不废话了,在项目根目录下运行:
```console ```console
$ cargo run $ cargo run
Compiling world_hello v0.1.0 (/Users/sunfei/development/rust/world_hello) Compiling world_hello v0.1.0 (/Users/sunfei/development/rust/world_hello)
@ -55,41 +55,41 @@ $ cargo run
Hello, world! Hello, world!
``` ```
好了,你已经看到程序的输出: `"Hello, world"`, 可能有读者不愿意了,说好了"世界,你好"呢? 别急,在下一节,我们再对代码进行修改。 好了,你已经看到程序的输出: `"Hello, world"`, 可能有读者不愿意了,说好了"世界,你好"呢? 别急,在下一节,我们再对代码进行修改。认真想来,"你好,世界“强调的是我对世界说你好,而"世界,你好“是世界对我说你好,明显是后者更有包容性和国际范儿,读者真·好眼光.
在上面的过程中,`cargo run`会对项目进行编译,然后再运行项目,如同我们下面将做的 上述代码,`cargo run`首先对项目进行编译,然后再运行,因此它实际上等同于运行了两个指令,如同我们下面将做的
#### 手动编译和运行项目 #### 手动编译和运行项目
先来编译项目: 编译
```console ```console
$ cargo build $ cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.00s Finished dev [unoptimized + debuginfo] target(s) in 0.00s
``` ```
接着手动运行 运行
```console ```console
$ ./target/debug/world_hello $ ./target/debug/world_hello
Hello, world! Hello, world!
``` ```
很简单对吧?细心的读者可能已经发现,在调用的时候,路径`./target/debug/world_hello`中有一个明晃晃的`debug`字段,没错我们运行的是`debug模式`,在这种模式下,**代码的编译速度会非常快**但是**运行速度就比较慢**了,原因在于这个模式下Rust编译器不会做任何的优化只为了尽快的编译完成让你的开发流程更加顺畅。 行云流水,但谈不上一气呵成. 细心的读者可能已经发现,在调用的时候,路径`./target/debug/world_hello`中有一个明晃晃的`debug`字段,没错我们运行的是`debug模式`,在这种模式下,**代码的编译速度会非常快**可是福兮祸所依,**运行速度就慢了**. 原因是,在`debug`模式下Rust编译器不会做任何的优化只为了尽快的编译完成让你的开发流程更加顺畅。
那如果我们想要高性能的代码怎么办?可以添加`--release`来编译: 作为尊贵的读者,咱自然可以要求更多,比如你想要高性能的代码怎么办? 简单,添加`--release`来编译:
- `cargo run --release` - `cargo run --release`
- `cargo build --release` - `cargo build --release`
如果你用的第二个命令,就要换一个路径来运行程序
运行我们的高性能`relese`程序:
```console ```console
$ ./target/release/world_hello $ ./target/release/world_hello
Hello, world! Hello, world!
``` ```
当项目大了后,`cargo run`和`cargo build`不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着!
## cargo check ## cargo check
当项目大了后,`cargo run`和`cargo build`不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着!
`cargo check`是我们在代码开发过程中用的最多的命令,它的作用很简单:快速的检查一下代码能否编译通过,所以速度会非常快,帮助我们节省大量的编译时间(毕竟Rust不是Go需要做很多复杂的编译优化和语言特性解析所以编译速度比Go慢了不少)。 `cargo check`是我们在代码开发过程中最常用的命令,它的作用很简单:快速的检查一下代码能否编译通过. 因此该命令速度会非常快,能节省大量的编译时间.
```console ```console
$ cargo check $ cargo check
@ -97,20 +97,23 @@ $ cargo check
Finished dev [unoptimized + debuginfo] target(s) in 0.06s Finished dev [unoptimized + debuginfo] target(s) in 0.06s
``` ```
> Rust虽然编译速度还行但是还是不能Go语言相提并论因为Rust需要做很多复杂的编译优化和语言特性解析, 甚至连如何优化编译速度都成了一门学问[优化编译速度](../compiler/spped-up.md)
## cargo.toml 和 cargo.lock ## cargo.toml 和 cargo.lock
`cargo.toml`和`cargo.lock`是cargo项目代码管理的核心文件cargo工具的所有活动均基于这两个文件。 `cargo.toml`和`cargo.lock`是`cargo`的核心文件,它的所有活动均基于此二者
`cargo.toml`是cargo特有的项目数据描述文件存储了项目的所有元配置信息如果rust开发者希望rust项目能够按照期望的方式进行构建、测试和运行那么必须按照合理的方式构建`cargo.toml`。 `cargo.toml`是cargo特有的项目数据描述文件存储了项目的所有元配置信息如果rust开发者希望rust项目能够按照期望的方式进行构建、测试和运行那么必须按照合理的方式构建`cargo.toml`。
`cargo.lock`文件是cargo工具根据同一项目的toml文件生成的项目依赖详细清单文件所以我们一般不用不管它只需要对着cargo.toml文件撸就行了。 `cargo.lock`文件是cargo工具根据同一项目的toml文件生成的项目依赖详细清单,因此我们一般不用修改它,只需要对着`cargo.toml`文件撸就行了。
> 什么情况下该把`cargo.lock`上传到git仓库里很简单当你的项目是一个可运行的程序时就上传`cargo.lock`,如果是一个依赖库项目,那么请把它添加到`.gitignore`中 > 什么情况下该把`cargo.lock`上传到git仓库里很简单当你的项目是一个可运行的程序时就上传`cargo.lock`,如果是一个依赖库项目,那么请把它添加到`.gitignore`中
现在可以打开"世界,你好"项目下的`cargo.toml`文件,我们来简单介绍下: 现在用Vscode打开上面创建的"世界,你好"项目,然后进入根目录的`cargo.toml`文件,该文件包含不少信息。
#### package配置段落 #### package配置段落
`package`配置了我们项目的一些描述信息,典型的如下: `package`记录了项目的描述信息,典型的如下:
```toml ```toml
[package] [package]
@ -119,12 +122,12 @@ version = "0.1.0"
edition = "2021" edition = "2021"
``` ```
`name`字段定义了项目名称,`version`字段定义了项目的当前版本,新项目默认是`0.1.0``edition`字段定义了我们使用的Rust大版本因为本书很新(不仅仅是现在新未来也将及时修订跟得上Rust最新大版本),所以我们使用的是`Rust edition 2021`大版本,现有的很多项目还在使用`Rust edition 2018`,具体参见[Rust版本详解](../appendix/rust-version.md). `name`字段定义了项目名称,`version`字段定义当前版本,新项目默认是`0.1.0``edition`字段定义了我们使用的Rust大版本因为本书很新(不仅仅是现在新未来也将及时修订跟得上Rust的小步伐),所以使用的是`Rust edition 2021`大版本,详情见[Rust版本详解](../appendix/rust-version.md).
#### 定义项目依赖 #### 定义项目依赖
使用cargo工具的最大优势就在于能够对该项目的各种依赖项进行方便、统一和灵活的管理。这也是使用cargo对Rust项目进行管理的重要目标之一。在cargo的toml文件描述中主要通过各种依赖段落来描述该项目的各种依赖项。`cargo.toml`中常用的依赖段落包括一下几种: 使用`cargo`工具的最大优势就在于,能够对该项目的各种依赖项进行方便、统一和灵活的管理。在`cargo.toml`中,主要通过各种依赖段落来描述该项目的各种依赖项:
- 基于rust官方仓库crates.io通过版本说明来描述 - 基于rust官方仓库crates.io通过版本说明来描述
- 基于项目源代码的git仓库地址通过URL来描述 - 基于项目源代码的git仓库地址通过URL来描述
@ -140,13 +143,13 @@ color = { git = "https://github.com/bjz/color-rs" }
geometry = { path = "crates/geometry" } geometry = { path = "crates/geometry" }
``` ```
相信聪明的读者已经能看懂该怎么引入外部依赖库,我们就不逐行解释了 相信聪明的读者已经能看懂该如何引入外部依赖库,这里就不再赘述
详细的说明参见此章:[Cargo依赖管理](../cargo/dependency.md),但是不建议新手现在去看,等学习后面,自然就能看到 详细的说明参见此章:[Cargo依赖管理](../cargo/dependency.md),但是不建议大家现在去看,只要按照目录浏览,拨云见雾只可待
## 基于cargo的项目组织结构 ## 基于cargo的项目组织结构
在上文我们已经看到了cargo默认生成的项目结构但是真实的项目还有所不同但是在目前的学习阶段我们还不需要关注这个,感兴趣的同学可以移步此处[Cargo项目结构](../cargo/layout.md) 前文有提到cargo默认生成的项目结构但是真实的项目还有所不同但是在目前的学习阶段还无需关注,感兴趣的同学可以移步[Cargo项目结构](../cargo/layout.md)
至此大家对Rust项目的创建和管理已经有了初步的了解让我们来完善刚才的`"世界,你好"`项目吧。 至此大家对Rust项目的创建和管理已经有了初步的了解那么来完善刚才的`"世界,你好"`项目吧。

@ -1,8 +1,10 @@
## 墙推VScode! ## 墙推VScode!
VScode从15年刚开始推出我就在使用了做为第一个吃螃蟹的人可以说见证了它一路的快速发展直到现在成为开源世界最火的IDE之一(弱弱的说一句,之一也许可以去掉).顺便歪楼说一句:我预言过三件事, 在13年预言Golang会火遍全世界,同时创建了14-19年最火的Golang隐修会社区可惜因为某些原因被封停了甚是遗憾在15年预言VScode会成为世界上最好的ide我是jaeger tracing项目的第一个star用户(是的,比作者还早),当时就很看好这个项目的后续发展 `VScode`从15年刚开始推出我就在使用了做为第一个吃螃蟹的人可以说见证了它一路的快速发展直到现在它已经成为开源世界最火的IDE之一(弱弱的说一句,之一也许可以去掉)。
现在呢我在这里正式预言未来Rust会成为最火的系统编程语言在应用开发之外的领域会大放光彩 顺便歪楼说一句:我预言过三件事, 在13年预言`Golang`会火遍全世界,同时创建了14-19年最火的Golang隐修会社区可惜因为某些原因被封停了甚是遗憾在15年预言`VScode`会成为世界上最好的IDE同时我还是`jaeger tracing`项目的第一个star用户(是的,比作者还早),当时就很看好这个项目的后续发展。
现在呢,我在这里正式预言: **未来`Rust`会成为主流编程语言之一,在几乎所有开发领域都将大放光彩**,总之牛逼已吹下,希望不要被打脸:(
下面继续简单介绍下VScode,以下内容引用于官网: 下面继续简单介绍下VScode,以下内容引用于官网:
@ -14,24 +16,24 @@ VScode从15年刚开始推出我就在使用了做为第一个吃螃蟹的
1. 官方的`Rust`,作者是`The Rust Programming Language`, 官方出品,牛逼就完了,但是。。。我们并不推荐,这个插件有几个问题: 1. 官方的`Rust`,作者是`The Rust Programming Language`, 官方出品,牛逼就完了,但是。。。我们并不推荐,这个插件有几个问题:
- 首先是在代码跳转上支持的很烂,只能在自己的代码库中跳转,一旦跳到别的三方库,那就无法继续跳转,对于查看标准库和三方库的源码带来了极大的困扰 - 首先是在代码跳转上支持的很烂,只能在自己的代码库中跳转,一旦跳到别的三方库,那就无法继续跳转,对于查看标准库和三方库的源码带来了极大的困扰
- 其次不支持类型自动标注对于Rust语言而言类型说明是非常重要的特别是在你不知道给变量一个什么类型时这种IDE的自动提示就变得弥足珍贵 - 其次不支持类型自动标注对于Rust语言而言类型说明是非常重要的特别是在你不知道给变量一个什么类型时这种IDE的自动提示就变得弥足珍贵
- 代码提示不太好用,有些方法即不提示,也不能跳转 - 代码提示不太好用,有些方法既不会提示,也不能跳转
2. 社区驱动的`rust-analyzer`非常推荐上面说的所有问题在这个插件上都得到了解决不得不说rust社区 yyds! 2. 社区驱动的`rust-analyzer`非常推荐上面说的所有问题在这个插件上都得到了解决不得不说rust社区 yyds!
所以,综上所述,我们选择`rust-analyer`作为Rust语言的插件具体的安装很简单点击插件选择安装即可根据提示可能需要重新加载ide 所以,综上所述,我们选择`rust-analyer`作为Rust语言的插件具体的安装很简单点击插件选择安装即可根据提示可能需要重新加载IDE
ide安装完成后在第一次打开Rust项目时需要安装一些依赖具体的状态在左下角会进行提示包括下载、代码构建building等。 安装完成后在第一次打开Rust项目时需要安装一些依赖具体的状态在左下角会进行提示包括下载、代码构建building等。
在插件默认设置下,每一次保存代码,都会出进行一次重新编译,如果你的电脑慢,有一点一定要注意:在编译器构建代码的同时,不要在终端再运行`cargo run`等命令进行编译不然会获得一个报错提示大意是当前文件目录已经被锁定等待其它使用者释放如果等了很久ide还是没有释放(虽然我没遇到过,但是存在这个可能性)你可以关掉ide并手动kill掉`rust-anylyzer`,然后重新尝试即可 当插件使用默认设置时,每一次保存代码,都会出进行一次重新编译,如果你的电脑慢,有一点一定要注意:在编译器构建代码的同时,不要在终端再运行`cargo run`等命令进行编译不然会获得一个报错提示大意是当前文件目录已经被锁定等待其它使用者释放如果等了很久ide还是没有释放(虽然我没遇到过,但是存在这个可能性)你可以关掉ide并手动kill掉`rust-anylyzer`,然后重新尝试。
> 在搜索VScode插件时报错`提取扩展出错XHR failed`,这个报错是因为网络原因导致,很可能是你的网络不行或者翻墙工具阻拦你的访问,试着关掉翻墙,再进行尝试 > 在搜索VScode插件时报错`提取扩展出错XHR failed`,这个报错是因为网络原因导致,很可能是你的网络不行或者翻墙工具阻拦你的访问,试着关掉翻墙,再进行尝试
## 安装其它好用的插件 ## 安装其它好用的插件
在此,再推荐大家几个好用的插件: 在此,再推荐大家几个好用的插件:
1. Better TOML用于更好的展示.toml文件 1. `Better TOML`,用于更好的展示.toml文件
2. Error Lens, 更好的获得错误展示 2. `Error Lens`, 更好的获得错误展示
3. One Dark Pro, 非常好看的Vscode主题 3. `One Dark Pro`, 非常好看的Vscode主题
4. CodeLLDB, debugger程序 4. `CodeLLDB`, debugger程序
好了至此Vscode的配置就已经全部结束是不是很简单下面让我们来用Cargo创建一个Rust项目然后用Vscode打开. 好了至此Vscode的配置就已经全部结束是不是很简单下面让我们来用Cargo创建一个Rust项目然后用Vscode打开.

@ -4,11 +4,11 @@
## 多国语言的"世界,你好" ## 多国语言的"世界,你好"
还记得我们之前讲到的[VScode](./editor.md) IDE和通过Cargo创建的[世界,你好](./cargo.md)工程吧? 还记得大明湖畔等你的[VScode](./editor.md) IDE和通过Cargo创建的[世界,你好](./cargo.md)工程嘛?
现在使用VScode打开我们在[上一节](./cargo.md)中创建的`world_hello`工程, 然后打开main.rs文件这是当前Rust工程的入口文件和其它语言没有区别。 现在使用VScode打开[上一节](./cargo.md)中创建的`world_hello`工程, 然后进入`main.rs`文件此文件是当前Rust工程的入口文件和其它语言几无区别。
将该文件内容修改为 接下来,对世界友人给予热切的问候
```rust ```rust
fn greet_world() { fn greet_world() {
let southern_germany = "Grüß Gott!"; let southern_germany = "Grüß Gott!";
@ -25,7 +25,7 @@ fn greet_world() {
} }
``` ```
然后打开终端,进入`world_hello`工程根目录,运行该程序(你也可以在VScode中打开终端,方法是点击左下角的错误和警告图标)可以看到来自世界各地的热情招呼 打开终端,进入`world_hello`工程根目录,运行该程序(你也可以在VScode中打开终端,方法是点击左下角的错误和警告图标)你的热情,好像一把火,燃烧了整个世界
```console ```console
$ cargo run $ cargo run
Compiling world_hello v0.1.0 (/Users/sunfei/development/rust/world_hello) Compiling world_hello v0.1.0 (/Users/sunfei/development/rust/world_hello)
@ -37,22 +37,20 @@ World, hello
sunfei@sunfeideMa sunfei@sunfeideMa
``` ```
花点时间来看看上面的代码首先Rust原生支持UTF-8编码的字符串这意味着你可以很容易的使用其它语言作为字符串内容。 花点时间来看看上面的代码首先Rust原生支持UTF-8编码的字符串这意味着你可以很容易的使用世界各国文字作为字符串内容。
其次,关注下`println`后面的`!`如果你有Ruby编程经验那么你可能会认为这是解构操作符但是在Rust中这是`宏`操作符,你目前可以认为宏是一种特殊类型函数。对于`println`来说,我们没有使用其它语言惯用的`%s`,`%d`来做输出占位符,而是使用{}因为Rust在底层帮我们做了大量工作会自动识别输出数据的类型例如当前例子会识别为`string`类型。 其次,关注下`println`后面的`!`如果你有Ruby编程经验那么你可能会认为这是解构操作符但是在Rust中这是`宏`操作符,你目前可以认为宏是一种特殊类型函数。
最后和其它语言不同rust的集合类型不能直接进行循环需要变成迭代器(这里是通过`.iter()`方法)后,才能用于迭代循环,在目前来看,你会觉得这一点好像挺麻烦,不急,以后就知道这么做的好处所在. 对于`println`来说,我们没有使用其它语言惯用的`%s`,`%d`来做输出占位符,而是使用`{}`因为Rust在底层帮我们做了大量工作会自动识别输出数据的类型例如当前例子会识别为`string`类型。
至于函数声明、调用、数组的使用和其它语言没什么区别so easy! 最后和其它语言不同rust的集合类型不能直接进行循环需要变成迭代器(这里是通过`.iter()`方法),才能用于迭代循环,在目前来看,你会觉得这一点好像挺麻烦,不急,以后就知道这么做的好处所在.
至于函数声明、调用、数组的使用和其它语言没什么区别so easy!
## Rust语言初印象 ## Rust语言初印象
Rust这门语言对于Haskell和Java开发来说会觉得很熟悉因为它们在高阶表达方面都很优秀简而言之可以很简洁的写出原本需要一大堆代码才能表达的含义但是Rust又有所不同它的性能是底层语言级别的性能可以跟C/C++相媲美。 Rust这门语言对于Haskell和Java开发来说会觉得很熟悉因为它们在高阶表达方面都很优秀简而言之可以很简洁的写出原本需要一大堆代码才能表达的含义但是Rust又有所不同它的性能是底层语言级别的性能可以跟C/C++相媲美。
在上一节咱们学习了非常简单的Rust入门代码现在来点复杂的然后说说你对Rust的初印象。 上一句的`so easy`的余音仍在绕梁,我希望它能继续下去,可是。。。人总是要面对现实,因此让我们来些狠的:
下面的例子是关于基础文本处理:
```rust ```rust
fn main() { fn main() {
let penguin_data = "\ let penguin_data = "\
@ -97,19 +95,19 @@ fn main() {
} }
``` ```
上面代码中值得注意的Rust特性有 看完这段代码,不知道你的余音有没有嘎然而止,反正我已经在颤抖了,这就是传说中的下马威嘛?上面代码中值得注意的Rust特性有
- 控制流:`for`和`continue`在一起,实现的循环 - 控制流:`for`和`continue`在一起,实现的循环
- 方法语法由于Rust没有继承因此Rust不是传统意义上的面向对象语言但是它却从OO语言那里偷师了方法的使用`record.trim()`,`record.split(',')`等 - 方法语法由于Rust没有继承因此Rust不是传统意义上的面向对象语言但是它却从`OO`语言那里偷师了方法的使用`record.trim()`,`record.split(',')`等
- 高阶函数编程: 函数可以作为参数也能作为返回值,例如`.map(|field| field.trim())`, 这里`map`使用闭包函数作为参数,也可以称呼为`匿名函数`、`lambda函数` - 高阶函数编程: 函数可以作为参数也能作为返回值,例如`.map(|field| field.trim())`, 这里`map`使用闭包函数作为参数,也可以称呼为`匿名函数`、`lambda函数`
- 类型标注: `if let Ok(length) = fields[1].parse::<f32>()`, 通过`::<f32>`的使用,告诉编译器`length`是一个`f32`类型的浮点数,这种类型标注不是很常用,但是在编译器无法推断出你的数据类型时,就很有用了 - 类型标注: `if let Ok(length) = fields[1].parse::<f32>()`, 通过`::<f32>`的使用,告诉编译器`length`是一个`f32`类型的浮点数,这种类型标注不是很常用,但是在编译器无法推断出你的数据类型时,就很有用了
- 条件编译: `if cfg!(debug_assertions)`,说明下面的输出打印只在`debug`模式下生效 - 条件编译: `if cfg!(debug_assertions)`,说明紧跟其后的输出打印只在`debug`模式下生效
- 隐式返回Rust提供了`return`关键字用于函数返回但是在很多时候我们可以省略它。因为Rust是[**基于表达式的语言**](../basic/statement-expression.md) - 隐式返回Rust提供了`return`关键字用于函数返回但是在很多时候我们可以省略它。因为Rust是[**基于表达式的语言**](../basic/base-type/statement-expression.md)
在终端中运行上述代码时,你会看到很多`debug: ...`的输出,你也已经了解,这是`条件编译`, 那么该怎么消除掉这些输出呢? 在终端运行上述代码时,会看到很多`debug: ...`的输出, 上面有讲,这些都是`条件编译`的输出, 那么该怎么消除掉这些输出呢?
读者大大肯定都很聪明,已经想到了:是的,在[认识Cargo](./cargo.md#手动编译和运行项目)中,曾经介绍过`--relese`参数,因为cargo run默认是运行的debug模式如果想要消灭那些`debug:`输出,我们需要更改为其它模式,其中最常用的模式就是`--release`也就是生产发布的模式。 读者大大普遍冰雪聪明,肯定已经想到:是的,在[认识Cargo](./cargo.md#手动编译和运行项目)中,曾经介绍过`--relese`参数,因为`cargo run`默认是运行`debug`模式. 因此想要消灭那些`debug:`输出,需要更改为其它模式,其中最常用的模式就是`--release`也就是生产发布的模式。
具体运行代码就不给了,留给大家作为一个小练习,建议亲自动手尝试下。 具体运行代码就不给了,留给大家作为一个小练习,建议亲自动手尝试下。
至此Rust安装入门就已经结束相信看到这里你已经发现了本书与其它书的区别其中最大的区别就是**这本书就像优秀的国外课本一样,由浅入深的在带领大家学习Rust而不是简单的复述一些语言的概念**,你可以回忆一下国内的线性代数等计算机教材,都是可以做为对照的反例(当然,不是说这些教材不优秀,只是这些教材需要优秀的老师支撑,而我们并没有) 至此Rust安装入门就已经结束相信看到这里你已经发现了本书与其它书的区别其中最大的区别就是**这本书就像优秀的国外课本一样,不太枯燥,也希望这本不太枯燥的书,能伴你长行,犹如一杯奶茶,细细品之,唇齿余香**

@ -4,7 +4,7 @@
> haha,开个玩笑读者乃大大怎么能弃之不顾所以注意如果你不想用或者不能用rustup请参见[Rust其它安装方法](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods) > haha,开个玩笑读者乃大大怎么能弃之不顾所以注意如果你不想用或者不能用rustup请参见[Rust其它安装方法](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods)
现在Rust稳定版特性越来越全了所以下载最新稳定版本即可。由于你用的Rust版本可能跟本书写的时候不一样所以一些编译错误和警告可能也会有所不同。 现在Rust稳定版特性越来越全了因此下载最新稳定版本即可。由于你用的Rust版本可能跟本书写的时候不一样一些编译错误和警告可能也会有所不同。
### 在 Linux 或 macOS 上安装 `rustup` ### 在 Linux 或 macOS 上安装 `rustup`
@ -15,36 +15,33 @@
$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
``` ```
这个命令将下载一个脚本并开始安装 `rustup` 工具,此工具将安装 `Rust` 的最新稳定版本。可能会提示你输入管理员密码如果安装成功,将出现下面这行: 这个命令将下载一个脚本并开始安装 `rustup` 工具,此工具将安装 `Rust` 的最新稳定版本。可能会提示你输入管理员密码, 如果安装成功,将出现下面这行:
```text ```text
Rust is installed now. Great! Rust is installed now. Great!
``` ```
注意,上面已经完成了Rust安装**假如在安装过程中遇到连接器错误,请继续往下看**,否则可以直接跳到[更新和卸载](#更新和卸载),继续阅读.
注意,上面已经完成了Rust安装**如果你在安装过程中遇到连接器错误,请继续往下看**,否则可以直接跳到[更新和卸载](#更新和卸载),继续阅读. Rust对运行环境和Go语言很像几乎所有环境都可以无需安装任何依赖直接运行但是Rust会依赖`libc`和链接器`linker`,所以如果遇到了提示链接器无法执行的错误你需要手动安装一个C语言编译器:
Rust对运行环境和Go语言很像几乎所有环境都可以无需安装任何依赖直接运行但是Rust会依赖libc和链接器linker,所以如果遇到了提示链接器无法执行的错误你需要手动安装一个C语言编译器即可:
**在Macos下** **在Macos下**
```console ```console
$ xcode-select --install $ xcode-select --install
``` ```
**在linux下** **在linux下**
Linux 用户一般应按照相应发行版的文档来安装 GCC 或 Clang。例如,如果你使用 Ubuntu则可安装 `build-essential` Linux 用户一般应按照相应发行版的文档来安装`GCC`或`Clang`。例如,如果你使用 Ubuntu则可安装 `build-essential`
### 在 Windows 上安装 `rustup` ### 在 Windows 上安装 `rustup`
windows上安装过程较为麻烦因此我们专门写了一篇文章来讲解相关的安装过程请参考[Windows安装](https://blog.csdn.net/erlib/article/details/121684998?spm=1001.2014.3001.5501). windows上安装Rust需要有`c++`环境,以下为安装的两种方式:
windows上安装要求有`c++`环境,以下为安装的两种方式
**1、x86_64-pc-windows-msvc(官方推荐)** **1、x86_64-pc-windows-msvc(官方推荐)**
先安装 [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/) 安装勾选 C++ 环境即可,安装时 可自行修改缓存路径与安装路径避免占用过多C盘空间。 先安装 [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/),安装勾选 C++ 环境即可,安装时 可自行修改缓存路径与安装路径避免占用过多C盘空间。
准备好 c++ 环境后开始安装 Rust [RUSTUP-INIT](https://www.rust-lang.org/learn/get-started) 下载系统相对应的Rust安装程序,一路默认就好。
准备好 C++ 环境后开始安装Rust: 在[RUSTUP-INIT](https://www.rust-lang.org/learn/get-started) 下载系统相对应的Rust安装程序, 一路默认即可。
``` shell ``` shell
PS C:\Users\Hehongyuan> rustup-init.exe PS C:\Users\Hehongyuan> rustup-init.exe
@ -60,14 +57,15 @@ Current installation options:
1) Proceed with installation (default) 1) Proceed with installation (default)
2) Customize installation 2) Customize installation
3) Cancel installation 3) Cancel installation
``` ```
**2、x86_64-pc-windows-gnu** **2、x86_64-pc-windows-gnu**
另外类别 C++ 环境其实官方也有说明 [Other Rust Installation Methods](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods) 该类型的C++ 环境其实官方也有说明 [Other Rust Installation Methods](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods).
个人习惯使用 [mingw-w64 官网](https://www.mingw-w64.org/) 当然也可以是[win-builds](http://win-builds.org/)
为了方便初学者使用 这里提供一个免安装的的方式 [mingw-w64下载](https://sourceforge.net/projects/mingw-w64/files/),演示选择的 `x86_64-posix-seh` 对于学习者,初次安装不需要纠结什么类别,因为切换版本很方便。下载完压缩包并解压,把压缩包下的 `/bin` 目录添加到 环境`Path` 即可 个人习惯使用 [mingw-w64 官网](https://www.mingw-w64.org/) , 当然你也可以选择[win-builds](http://win-builds.org/).
为了方便初学者使用 这里提供一个免安装的的方式 [mingw-w64下载](https://sourceforge.net/projects/mingw-w64/files/),演示选择的 `x86_64-posix-seh` 对于学习者,初次安装不需要纠结什么类别,因为切换版本很方便。下载完压缩包并解压,把压缩包下的 `/bin` 目录添加到 环境`Path` 即可:
<img alt="" src="/img/mingw-w64-download" class="center" /> <img alt="" src="/img/mingw-w64-download" class="center" />
1、验证 c++ 环境 1、验证 c++ 环境
@ -113,33 +111,36 @@ Profile (which tools and data to install)? (minimal/default/complete) [default]
``` ```
> windows上安装过程较为麻烦因此我们专门写了一篇文章来讲解相关的安装过程请参考[Windows安装](https://blog.csdn.net/erlib/article/details/121684998?spm=1001.2014.3001.5501).
### 更新和卸载 ### 更新和卸载
通过 `rustup` 安装 Rust 后,更新到最新版本很简单。在 shell 中运行以下更新命令: 通过 `rustup` 安装 Rust 后,更新到最新版本很简单。在终端中运行以下更新命令:
```console ```console
$ rustup update $ rustup update
``` ```
要卸载 `Rust``rustup`,在 shell 中运行以下卸载命令: 要卸载 `Rust``rustup`,在终端中运行以下卸载命令:
```console ```console
$ rustup self uninstall $ rustup self uninstall
``` ```
### 疑难解答 ### 检查安装是否成功
要检查是否正确安装了 Rust可打开 shell 并输入下面这行,你应该看到最新发布的稳定版本的版本号、提交哈希值和提交日期: 检查是否正确安装了 Rust可打开终端并输入下面这行, 此时能看到最新发布的稳定版本的版本号、提交哈希值和提交日期:
```console ```console
$ rustc -V $ rustc -V
rustc 1.56.1 (59eed8a2a 2021-11-01) rustc 1.56.1 (59eed8a2a 2021-11-01)
``` ```
如果你看到此信息,则说明您已成功安装 Rust如果没看到此信息并且你使用的是 Windows请检查 Rust 是否在 `%PATH%` 系统变量中。如果都正确,但 `Rust` 仍然无法正常工作,那么你可以在很多地方获得帮助。最简单的是**加入Rust编程学院这个大家庭QQ群1009730433**. 恭喜,你已成功安装 Rust如果没看到此信息并且你使用的是 Windows请检查 Rust 是否在 `%PATH%` 系统变量中。如果都正确,但 `Rust` 仍然无法正常工作,那么你可以在很多地方获得帮助。最简单的是**加入Rust编程学院这个大家庭QQ群1009730433**.
### 本地文档 ### 本地文档
Rust 的安装还自带文档的本地副本,可以方便地离线阅读。运行 `rustup doc` 让浏览器打开本地文档。 安装Rust的同时也会在本地安装一个文档服务方便我们离线阅读: 运行 `rustup doc` 让浏览器打开本地文档。
每当遇到标准库提供的类型或函数不知道怎么用时,都可以在 API 文档中查找到!具体参[在标准库寻找你想要的内容](../std/search.md) 每当遇到标准库提供的类型或函数不知道怎么用时,都可以在 API 文档中查找到!具体参[在标准库寻找你想要的内容](../std/search.md)

@ -1,6 +1,6 @@
# 寻找牛刀,以便小试 # 寻找牛刀,以便小试
其实对于写这种章节,我内心是拒绝的,因为真的很无趣,对于一本书而言,这也更像是一种浪费纸张的行为(好在咱无纸化:-D),不过没有办法,没有Rust,总不能让大家用空气运行吧, so, 我恶趣味的起了一个这样的章节名。 其实对于写这种章节,我内心是拒绝的,因为真的很无趣,对于一本书而言,这也更像是一种浪费纸张的行为(好在咱无纸化:-D),不过没有办法,如果不安装Rust环境,总不能让大家用空气运行吧, so, 我恶趣味的起了一个这样的章节名。
在本章中,你将学习以下内容: 在本章中,你将学习以下内容:
1. 在Macos、Linux、Windows上安装Rust以及相关工具链 1. 在Macos、Linux、Windows上安装Rust以及相关工具链

Loading…
Cancel
Save