diff --git a/book/contents/first-try/cargo.md b/book/contents/first-try/cargo.md index e051529a..42b341c5 100644 --- a/book/contents/first-try/cargo.md +++ b/book/contents/first-try/cargo.md @@ -1,33 +1,33 @@ ## 认识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环节: +终于到了紧张刺激的 new new new 环节: ```console $ cargo new world_hello ``` -上面的命令使用`cargo new`创建一个项目,项目名是`world_hello`(向读者势力低头的项目名称,泪奔),该项目的结构和配置文件都是由`cargo`生成,意味着**我们的项目被cargo所管理**。 +上面的命令使用 `cargo new` 创建一个项目,项目名是 `world_hello` (向读者势力低头的项目名称,泪奔),该项目的结构和配置文件都是由 `cargo` 生成,意味着**我们的项目被 `cargo` 所管理**。 -早期的cargo在创建项目时,必须添加`--bin`的参数,如下所示: +早期的 `cargo` 在创建项目时,必须添加 `--bin` 的参数,如下所示: ```console $ cargo new world_hello --bin ``` -现在的版本,已经无需此参数,`cargo`默认就创建`bin`类型的项目,顺便说一句,Rust项目主要分为两个类型:`bin`和`lib`,前者是一个可运行的项目,后者是一个依赖库项目。 +现在的版本,已经无需此参数,`cargo` 默认就创建 `bin` 类型的项目,顺便说一句,Rust 项目主要分为两个类型:`bin` 和 `lib`,前者是一个可运行的项目,后者是一个依赖库项目。 下面来看看创建的项目结构: ```console @@ -40,7 +40,7 @@ $ cargo new world_hello --bin ``` -是的,连git都给你创建了,不仅令人感叹,不是女儿,胜似女儿,比小棉袄还体贴。 +是的,连 `git` 都给你创建了,不仅令人感叹,不是女儿,胜似女儿,比小棉袄还体贴。 ## 运行项目 有两种方式可以运行项目,先来看看第一种. @@ -55,9 +55,9 @@ $ cargo run Hello, world! ``` -好了,你已经看到程序的输出: `"Hello, world"`, 可能有读者不愿意了,说好了"世界,你好"呢? 别急,在下一节,我们再对代码进行修改。认真想来,"你好,世界“强调的是我对世界说你好,而"世界,你好“是世界对我说你好,明显是后者更有包容性和国际范儿,读者真·好眼光. +好了,你已经看到程序的输出: `"Hello, world"`, 可能有读者不愿意了,说好了"世界,你好"呢? 别急,在下一节,我们再对代码进行修改。认真想来,"你好,世界“强调的是我对世界说你好,而"世界,你好“是世界对我说你好,明显是后者更有包容性和国际范儿,读者真·好眼光。 -上述代码,`cargo run`首先对项目进行编译,然后再运行,因此它实际上等同于运行了两个指令,如同我们下面将做的 +上述代码,`cargo run` 首先对项目进行编译,然后再运行,因此它实际上等同于运行了两个指令,如同我们下面将做的: #### 手动编译和运行项目 @@ -73,13 +73,13 @@ $ ./target/debug/world_hello Hello, world! ``` -行云流水,但谈不上一气呵成. 细心的读者可能已经发现,在调用的时候,路径`./target/debug/world_hello`中有一个明晃晃的`debug`字段,没错我们运行的是`debug模式`,在这种模式下,**代码的编译速度会非常快**,可是福兮祸所依,**运行速度就慢了**. 原因是,在`debug`模式下,Rust编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。 +行云流水,但谈不上一气呵成。 细心的读者可能已经发现,在调用的时候,路径 `./target/debug/world_hello` 中有一个明晃晃的 `debug` 字段,没错我们运行的是 `debug` 模式,在这种模式下,**代码的编译速度会非常快**,可是福兮祸所依,**运行速度就慢了**. 原因是,在 `debug` 模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。 -作为尊贵的读者,咱自然可以要求更多,比如你想要高性能的代码怎么办? 简单,添加`--release`来编译: +作为尊贵的读者,咱自然可以要求更多,比如你想要高性能的代码怎么办? 简单,添加 `--release` 来编译: - `cargo run --release` - `cargo build --release` -运行我们的高性能`relese`程序: +运行我们的高性能 `relese` 程序: ```console $ ./target/release/world_hello @@ -87,9 +87,9 @@ Hello, world! ``` ## cargo check -当项目大了后,`cargo run`和`cargo build`不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着! +当项目大了后,`cargo run` 和 `cargo build` 不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着! -`cargo check`是我们在代码开发过程中最常用的命令,它的作用很简单:快速的检查一下代码能否编译通过. 因此该命令速度会非常快,能节省大量的编译时间. +`cargo check` 是我们在代码开发过程中最常用的命令,它的作用很简单:快速的检查一下代码能否编译通过。因此该命令速度会非常快,能节省大量的编译时间。 ```console $ cargo check @@ -97,23 +97,23 @@ $ cargo check Finished dev [unoptimized + debuginfo] target(s) in 0.06s ``` -> Rust虽然编译速度还行,但是还是不能Go语言相提并论,因为Rust需要做很多复杂的编译优化和语言特性解析, 甚至连如何优化编译速度都成了一门学问[优化编译速度](../compiler/speed-up.md) +> Rust 虽然编译速度还行,但是还是不能 Go语言相提并论,因为 Rust 需要做很多复杂的编译优化和语言特性解析, 甚至连如何优化编译速度都成了一门学问[优化编译速度](../compiler/speed-up.md) -## cargo.toml 和 cargo.lock +## Cargo.toml 和 Cargo.lock -`cargo.toml`和`cargo.lock`是`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` 中 -现在用Vscode打开上面创建的"世界,你好"项目,然后进入根目录的`cargo.toml`文件,该文件包含不少信息。 +现在用 VSCode 打开上面创建的"世界,你好"项目,然后进入根目录的 `Cargo.toml` 文件,该文件包含不少信息。 #### package配置段落 -`package`中记录了项目的描述信息,典型的如下: +`package` 中记录了项目的描述信息,典型的如下: ```toml [package] @@ -122,15 +122,15 @@ version = "0.1.0" edition = "2021" ``` -`name`字段定义了项目名称,`version`字段定义当前版本,新项目默认是`0.1.0`,`edition`字段定义了我们使用的Rust大版本,因为本书很新(不仅仅是现在新,未来也将及时修订,跟得上Rust的小步伐),所以使用的是`Rust edition 2021`大版本,详情见[Rust版本详解](../appendix/rust-version.md). +`name` 字段定义了项目名称,`version` 字段定义当前版本,新项目默认是 `0.1.0`,`edition` 字段定义了我们使用的 Rust 大版本,因为本书很新(不仅仅是现在新,未来也将及时修订,跟得上 Rust 的小步伐),所以使用的是 `Rust edition 2021` 大版本,详情见[Rust版本详解](../appendix/rust-version.md). #### 定义项目依赖 -使用`cargo`工具的最大优势就在于,能够对该项目的各种依赖项进行方便、统一和灵活的管理。在`cargo.toml`中,主要通过各种依赖段落来描述该项目的各种依赖项: +使用 `cargo` 工具的最大优势就在于,能够对该项目的各种依赖项进行方便、统一和灵活的管理。在 `Cargo.toml` 中,主要通过各种依赖段落来描述该项目的各种依赖项: -- 基于rust官方仓库crates.io,通过版本说明来描述 -- 基于项目源代码的git仓库地址,通过URL来描述 +- 基于 Rust 官方仓库 `crates.io`,通过版本说明来描述 +- 基于项目源代码的 git仓库地址,通过 URL 来描述 - 基于本地项目的绝对路径或者相对路径,通过类Unix模式的路径来描述 这三种形式具体写法如下: @@ -145,11 +145,11 @@ geometry = { path = "crates/geometry" } 相信聪明的读者已经能看懂该如何引入外部依赖库,这里就不再赘述。 -详细的说明参见此章:[Cargo依赖管理](../cargo/dependency.md),但是不建议大家现在去看,只要按照目录浏览,拨云见雾只可待。 +详细的说明参见此章:[Cargo依赖管理](../cargo/dependency.md),但是不建议大家现在去看,只要按照目录浏览,拨云见雾只可待。 ## 基于cargo的项目组织结构 -前文有提到cargo默认生成的项目结构,但是真实的项目还有所不同,但是在目前的学习阶段,还无需关注,感兴趣的同学可以移步:[Cargo项目结构](../cargo/layout.md) +前文有提到 `cargo` 默认生成的项目结构,但是真实的项目还有所不同,但是在目前的学习阶段,还无需关注,感兴趣的同学可以移步:[Cargo项目结构](../cargo/layout.md) -至此,大家对Rust项目的创建和管理已经有了初步的了解,那么来完善刚才的`"世界,你好"`项目吧。 \ No newline at end of file +至此,大家对 Rust 项目的创建和管理已经有了初步的了解,那么来完善刚才的`"世界,你好"`项目吧。 diff --git a/book/contents/first-try/editor.md b/book/contents/first-try/editor.md index b352fdd7..1f597852 100644 --- a/book/contents/first-try/editor.md +++ b/book/contents/first-try/editor.md @@ -1,39 +1,39 @@ -## 墙推VScode! +## 墙推VSCode! -`VScode`从15年刚开始推出,我就在使用了,做为第一个吃螃蟹的人,可以说见证了它一路的快速发展,直到现在它已经成为开源世界最火的IDE之一(弱弱的说一句,之一也许可以去掉)。 +`VSCode` 从15年刚开始推出,我就在使用了,做为第一个吃螃蟹的人,可以说见证了它一路的快速发展,直到现在它已经成为开源世界最火的 IDE 之一(弱弱的说一句,之一也许可以去掉)。 -顺便歪楼说一句:我预言过三件事, 在13年预言`Golang`会火遍全世界,同时创建了14-19年最火的Golang隐修会社区,可惜因为某些原因被封停了,甚是遗憾;在15年预言`VScode`会成为世界上最好的IDE;同时我还是`jaeger tracing`项目的第一个star用户(是的,比作者还早),当时就很看好这个项目的后续发展。 +顺便歪楼说一句:我预言过三件事, 在13年预言 `Golang` 会火遍全世界,同时创建了14-19年最火的 Golang 隐修会社区,可惜因为某些原因被封停了,甚是遗憾;在15年预言 `VSCode` 会成为世界上最好的 IDE;同时我还是 `jaeger tracing` 项目的第一个star用户(是的,比作者还早),当时就很看好这个项目的后续发展。 -现在呢,我在这里正式预言: **未来`Rust`会成为主流编程语言之一,在几乎所有开发领域都将大放光彩**,总之牛逼已吹下,希望不要被打脸:( +现在呢,我在这里正式预言: **未来 `Rust` 会成为主流编程语言之一,在几乎所有开发领域都将大放光彩**,总之牛逼已吹下,希望不要被打脸:( -下面继续简单介绍下VScode,以下内容引用于官网: +下面继续简单介绍下 VScode,以下内容引用于官网: -> Visual Studio Code(VS Code)是微软2015年推出的一个轻量但功能强大的源代码编辑器,基于 Electron 开发,支持 Windows、Linux 和 macOS 操作系统。它内置了对JavaScript,TypeScript和Node.js的支持并且具有丰富的其它语言和扩展的支持,功能超级强大。Visual Studio Code是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段、代码对比 Diff、GIT命令 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。 +> Visual Studio Code(VSCode)是微软2015年推出的一个轻量但功能强大的源代码编辑器,基于 Electron 开发,支持 Windows、Linux 和 MacOS 操作系统。它内置了对 JavaScript,TypeScript 和 Node.js 的支持并且具有丰富的其它语言和扩展的支持,功能超级强大。Visual Studio Code 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段、代码对比 Diff、GIT 命令等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。 -## 安装Vscode的Rust插件 +## 安装VSCode的 Rust 插件 -在VScode的左侧扩展目录里,搜索`rust`,你能看到两个Rust插件,如果没有意外,这两个应该分别排名第一和第二: -1. 官方的`Rust`,作者是`The Rust Programming Language`, 官方出品,牛逼就完了,但是。。。我们并不推荐,这个插件有几个问题: +在VScode的左侧扩展目录里,搜索 `rust`,你能看到两个 Rust 插件,如果没有意外,这两个应该分别排名第一和第二: +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。 -安装完成后,在第一次打开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`, 更好的获得错误展示 -3. `One Dark Pro`, 非常好看的Vscode主题 -4. `CodeLLDB`, debugger程序 +3. `One Dark Pro`, 非常好看的 VSCode 主题 +4. `CodeLLDB`, Debugger 程序 -好了,至此,Vscode的配置就已经全部结束,是不是很简单?下面让我们来用Cargo创建一个Rust项目,然后用Vscode打开. \ No newline at end of file +好了,至此,VSCode 的配置就已经全部结束,是不是很简单?下面让我们来用 `Cargo` 创建一个 Rust 项目,然后用 VSCode 打开。 diff --git a/book/contents/first-try/hello-world.md b/book/contents/first-try/hello-world.md index a3a9155f..3fa38986 100644 --- a/book/contents/first-try/hello-world.md +++ b/book/contents/first-try/hello-world.md @@ -1,12 +1,12 @@ # 不仅仅是Hello world -几乎所有教程中安装的最后一个环节都是`hello world`,我们也不能免俗,但是在`hello world`之后,还有一个相亲,阿呸,Rust初印象环节,希望大家喜欢。 +几乎所有教程中安装的最后一个环节都是 `hello world`,我们也不能免俗,但是在 `hello world` 之后,还有一个相亲,阿呸,Rust 初印象环节,希望大家喜欢。 ## 多国语言的"世界,你好" -还记得大明湖畔等你的[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 @@ -25,7 +25,7 @@ fn greet_world() { } ``` -打开终端,进入`world_hello`工程根目录,运行该程序(你也可以在VScode中打开终端,方法是点击左下角的错误和警告图标),你的热情,好像一把火,燃烧了整个世界: +打开终端,进入 `world_hello` 工程根目录,运行该程序(你也可以在 VSCode 中打开终端,方法是点击左下角的错误和警告图标),你的热情,好像一把火,燃烧了整个世界: ```console $ cargo run Compiling world_hello v0.1.0 (/Users/sunfei/development/rust/world_hello) @@ -37,20 +37,20 @@ World, hello sunfei@sunfeideMa ``` -花点时间来看看上面的代码,首先,Rust原生支持UTF-8编码的字符串,这意味着你可以很容易的使用世界各国文字作为字符串内容。 +花点时间来看看上面的代码,首先,Rust 原生支持 UTF-8 编码的字符串,这意味着你可以很容易的使用世界各国文字作为字符串内容。 -其次,关注下`println`后面的`!`,如果你有Ruby编程经验,那么你可能会认为这是解构操作符,但是在Rust中,这是`宏`操作符,你目前可以认为宏是一种特殊类型函数。 +其次,关注下 `println` 后面的 `!`,如果你有 Ruby 编程经验,那么你可能会认为这是解构操作符,但是在 Rust 中,这是 `宏` 操作符,你目前可以认为宏是一种特殊类型函数。 -对于`println`来说,我们没有使用其它语言惯用的`%s`,`%d`来做输出占位符,而是使用`{}`,因为Rust在底层帮我们做了大量工作,会自动识别输出数据的类型,例如当前例子,会识别为`string`类型。 +对于 `println` 来说,我们没有使用其它语言惯用的 `%s`,`%d` 来做输出占位符,而是使用 `{}`,因为 Rust 在底层帮我们做了大量工作,会自动识别输出数据的类型,例如当前例子,会识别为 `String` 类型。 -最后,和其它语言不同,rust的集合类型不能直接进行循环,需要变成迭代器(这里是通过`.iter()`方法),才能用于迭代循环,在目前来看,你会觉得这一点好像挺麻烦,不急,以后就知道这么做的好处所在. +最后,和其它语言不同,Rust 的集合类型不能直接进行循环,需要变成迭代器(这里是通过 `.iter()` 方法),才能用于迭代循环,在目前来看,你会觉得这一点好像挺麻烦,不急,以后就知道这么做的好处所在。 -至于函数声明、调用、数组的使用,和其它语言没什么区别,so easy! +至于函数声明、调用、数组的使用,和其它语言没什么区别,So Easy! ## Rust语言初印象 -Rust这门语言对于Haskell和Java开发来说,会觉得很熟悉,因为它们在高阶表达方面都很优秀,简而言之,可以很简洁的写出原本需要一大堆代码才能表达的含义,但是Rust又有所不同:它的性能是底层语言级别的性能,可以跟C/C++相媲美。 +Rust 这门语言对于 Haskell 和 Java 开发来说,会觉得很熟悉,因为它们在高阶表达方面都很优秀,简而言之,可以很简洁的写出原本需要一大堆代码才能表达的含义,但是 Rust 又有所不同:它的性能是底层语言级别的性能,可以跟 C/C++ 相媲美。 -上一句的`so easy`的余音仍在绕梁,我希望它能继续下去,可是。。。人总是要面对现实,因此让我们来些狠的: +上一句的 `So Easy` 的余音仍在绕梁,我希望它能继续下去,可是……人总是要面对现实,因此让我们来些狠的: ```rust fn main() { let penguin_data = "\ @@ -95,19 +95,19 @@ fn main() { } ``` -看完这段代码,不知道你的余音有没有嘎然而止,反正我已经在颤抖了,这就是传说中的下马威嘛?上面代码中值得注意的Rust特性有: -- 控制流:`for`和`continue`在一起,实现的循环 -- 方法语法:由于Rust没有继承,因此Rust不是传统意义上的面向对象语言,但是它却从`OO`语言那里偷师了方法的使用`record.trim()`,`record.split(',')`等 -- 高阶函数编程: 函数可以作为参数也能作为返回值,例如`.map(|field| field.trim())`, 这里`map`使用闭包函数作为参数,也可以称呼为`匿名函数`、`lambda函数` -- 类型标注: `if let Ok(length) = fields[1].parse::()`, 通过`::`的使用,告诉编译器`length`是一个`f32`类型的浮点数,这种类型标注不是很常用,但是在编译器无法推断出你的数据类型时,就很有用了 -- 条件编译: `if cfg!(debug_assertions)`,说明紧跟其后的输出打印只在`debug`模式下生效 -- 隐式返回:Rust提供了`return`关键字用于函数返回,但是在很多时候,我们可以省略它。因为Rust是[**基于表达式的语言**](../basic/base-type/statement-expression.md) +看完这段代码,不知道你的余音有没有嘎然而止,反正我已经在颤抖了,这就是传说中的下马威嘛?上面代码中值得注意的 Rust 特性有: +- 控制流:`for` 和 `continue` 在一起,实现的循环 +- 方法语法:由于 Rust 没有继承,因此 Rust 不是传统意义上的面向对象语言,但是它却从 `OO` 语言那里偷师了方法的使用 `record.trim()`,`record.split(',')` 等 +- 高阶函数编程:函数可以作为参数也能作为返回值,例如 `.map(|field| field.trim())`,这里 `map` 使用闭包函数作为参数,也可以称呼为 `匿名函数`、`lambda函数` +- 类型标注:`if let Ok(length) = fields[1].parse::()`, 通过 `::` 的使用,告诉编译器 `length` 是一个 `f32` 类型的浮点数,这种类型标注不是很常用,但是在编译器无法推断出你的数据类型时,就很有用了 +- 条件编译:`if cfg!(debug_assertions)`,说明紧跟其后的输出打印只在 `debug` 模式下生效 +- 隐式返回:Rust 提供了 `return` 关键字用于函数返回,但是在很多时候,我们可以省略它。因为 Rust 是[**基于表达式的语言**](../basic/base-type/statement-expression.md) -在终端运行上述代码时,会看到很多`debug: ...`的输出, 上面有讲,这些都是`条件编译`的输出, 那么该怎么消除掉这些输出呢? +在终端运行上述代码时,会看到很多 `debug: ...` 的输出, 上面有讲,这些都是 `条件编译` 的输出, 那么该怎么消除掉这些输出呢? -读者大大普遍冰雪聪明,肯定已经想到:是的,在[认识Cargo](./cargo.md#手动编译和运行项目)中,曾经介绍过`--release`参数,因为`cargo run`默认是运行`debug`模式. 因此想要消灭那些`debug:`输出,需要更改为其它模式,其中最常用的模式就是`--release`也就是生产发布的模式。 +读者大大普遍冰雪聪明,肯定已经想到:是的,在[认识Cargo](./cargo.md#手动编译和运行项目)中,曾经介绍过 `--release` 参数,因为 `cargo run` 默认是运行 `debug` 模式. 因此想要消灭那些 `debug:` 输出,需要更改为其它模式,其中最常用的模式就是 `--release` 也就是生产发布的模式。 具体运行代码就不给了,留给大家作为一个小练习,建议亲自动手尝试下。 -至此,Rust安装入门就已经结束,相信看到这里,你已经发现了本书与其它书的区别,其中最大的区别就是:**这本书就像优秀的国外课本一样,不太枯燥,也希望这本不太枯燥的书,能伴你长行,犹如一杯奶茶,细细品之,唇齿余香**。 +至此,Rust 安装入门就已经结束,相信看到这里,你已经发现了本书与其它书的区别,其中最大的区别就是:**这本书就像优秀的国外课本一样,不太枯燥,也希望这本不太枯燥的书,能伴你长行,犹如一杯奶茶,细细品之,唇齿余香**。 diff --git a/book/contents/first-try/installation.md b/book/contents/first-try/installation.md index c901e9c5..5a64af36 100644 --- a/book/contents/first-try/installation.md +++ b/book/contents/first-try/installation.md @@ -1,7 +1,7 @@ # 安装 Rust `rustup` 是 Rust 的安装程序,也是它的版本管理程序。 -强烈建议使用`rustup`来安装 Rust,当然如果你有异心,请寻找其它安装方式,然后再从下一节开始阅读。 +强烈建议使用 `rustup` 来安装 Rust,当然如果你有异心,请寻找其它安装方式,然后再从下一节开始阅读。 > haha,开个玩笑。读者乃大大,怎么能弃之不顾。 > @@ -17,7 +17,7 @@ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh ``` -这个命令将下载一个脚本并开始安装 `rustup` 工具,此工具将安装 `Rust` 的最新稳定版本。可能会提示你输入管理员密码。 +这个命令将下载一个脚本并开始安装 `rustup` 工具,此工具将安装 Rust 的最新稳定版本。可能会提示你输入管理员密码。 如果安装成功,将出现下面这行: @@ -29,21 +29,22 @@ OK,这样就已经完成 Rust 安装啦。 ### 安装 C 语言编译器:(非必需) -Rust 对运行环境和 Go 语言很像,几乎所有环境都可以无需安装任何依赖直接运行。但是,Rust 会依赖`libc`和链接器`linker`。所以如果遇到了提示链接器无法执行的错误,你需要再手动安装一个 C 语言编译器: +Rust 对运行环境和 Go 语言很像,几乎所有环境都可以无需安装任何依赖直接运行。但是,Rust 会依赖 `libc` 和链接器 `linker`。所以如果遇到了提示链接器无法执行的错误,你需要再手动安装一个 C 语言编译器: + +**MacOS 下:** -**Macos 下:** ```console xcode-select --install ``` **Linux 下:** -Linux 用户一般应按照相应发行版的文档来安装`GCC`或`Clang`。 +Linux 用户一般应按照相应发行版的文档来安装 `GCC` 或 `Clang`。 例如,如果你使用 Ubuntu,则可安装 `build-essential`。 ## 在 Windows 上安装 `rustup` -windows 上安装 Rust 需要有`c++` 环境,以下为安装的两种方式: +Windows 上安装 Rust 需要有 `C++` 环境,以下为安装的两种方式: **1. `x86_64-pc-windows-msvc`(官方推荐)** @@ -70,15 +71,16 @@ Current installation options: **2、`x86_64-pc-windows-gnu`** -相比于 msvc 版本来说,gnu 版本具有更轻量,更靠近 linux 的优势。 +相比于 MSVC 版本来说,GNU 版本具有更轻量,更靠近 Linux 的优势。 首先,根据 [MSYS2 官网](https://www.msys2.org/) 配置 MSYS。 若您觉得下载太慢,可以试试由 [Caviar-X](https://github.com/Caviar-X) 提供的 [代理](https://github.pigeons.icu/msys2/msys2-installer/releases/download/2021-11-30/msys2-x86_64-20211130.exe)。 -在安装 mingw-toolchain 后,请将`%MSYS 安装路径%\mingw64\bin`添加到系统变量`PATH`中。 +在安装 `mingw-toolchain` 后,请将 `%MSYS 安装路径%\mingw64\bin` 添加到系统变量 `PATH` 中。 配置好后,在 MSYS 中输入下面的命令来安装 rustup。 + ```bash curl https://sh.rustup.rs -sSf | sh ``` @@ -125,11 +127,12 @@ Current installation options: 3) Cancel installation > ``` -再之后,按下 1,等待。完成后,您就已经安装了 `Rust` 和 `rustup`。 + +再之后,按下 1,等待。完成后,您就已经安装了 Rust 和 `rustup`。 ## 卸载 -要卸载 `Rust` 和 `rustup`,在终端执行以下命令即可卸载: +要卸载 Rust 和 `rustup`,在终端执行以下命令即可卸载: ```bash rustup self uninstall @@ -150,7 +153,7 @@ cargo 1.57.0 (b2e52d7ca 2021-10-21) 恭喜,你已成功安装 Rust!如果没看到此信息,并且你使用的是 Windows,请检查 Rust 或 `%USERPROFILE%\.cargo\bin` 是否在 `%PATH%` 系统变量中。 -如果都正确,但 `Rust` 仍然无法正常工作,那么你可以在很多地方获得帮助。最简单的是**加入 Rust 编程学院这个大家庭,QQ 群:1009730433**. +如果都正确,但 Rust 仍然无法正常工作,那么你可以在很多地方获得帮助。最简单的是**加入 Rust 编程学院这个大家庭,QQ 群:1009730433**. ## 本地文档 diff --git a/book/contents/first-try/intro.md b/book/contents/first-try/intro.md index 4521d1c4..d616d7fb 100644 --- a/book/contents/first-try/intro.md +++ b/book/contents/first-try/intro.md @@ -4,7 +4,7 @@ 在本章中,你将学习以下内容: -1. 在 Macos、Linux、Windows 上安装 Rust 以及相关工具链 +1. 在 MacOS、Linux、Windows 上安装 Rust 以及相关工具链 2. 搭建 Vscode 所需的环境 3. 简单介绍 Cargo 4. 实现一个酷炫多国语言版本的“世界,你好”的程序,并且谈谈对 Rust 语言的初印象