diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 19729845..468b1b82 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -180,7 +180,8 @@ - [编译器 todo](compiler/intro.md) - [常见属性标记](compiler/attributes.md) - + - [优化编译速度](compiler/speed-up.md) + - [标准库解析 todo](std/intro.md) - [如何寻找你想要的内容](std/search.md) diff --git a/src/first-try/cargo.md b/src/first-try/cargo.md index dfa6f250..2f171a97 100644 --- a/src/first-try/cargo.md +++ b/src/first-try/cargo.md @@ -1,33 +1,35 @@ ## 认识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 $ cargo new world_hello ``` -上面的命令使用`cargo new`创建了一个项目,项目名是`world_hello`(向读者势力低头的项目名称,泪奔),这个项目的结构和配置文件都是由`cargo`生成,这种结构和配置文件意味着**该项目被cargo所管理**,早期的cargo在创建项目时,必须添加`--bin`的参数,如下所示: +上面的命令使用`cargo new`创建一个项目,项目名是`world_hello`(向读者势力低头的项目名称,泪奔),该项目的结构和配置文件都是由`cargo`生成,意味着**我们的项目被cargo所管理**。 + +早期的cargo在创建项目时,必须添加`--bin`的参数,如下所示: ```console $ cargo new world_hello --bin ``` -现在的版本,已经无需这个参数,`cargo`默认就为我们创建`bin`类型的项目,顺便说一句,rust项目主要分为两个类型:bin和lib,前者是一个可以运行的项目,后者是一个依赖库项目。 +现在的版本,已经无需此参数,`cargo`默认就创建`bin`类型的项目,顺便说一句,Rust项目主要分为两个类型:`bin`和`lib`,前者是一个可运行的项目,后者是一个依赖库项目。 -创建的项目结构: +下面来看看创建的项目结构: ```console . ├── .git @@ -38,15 +40,13 @@ $ cargo new world_hello --bin ``` -是的,连git都给你创建了,比小棉袄还体贴。 +是的,连git都给你创建了,不仅令人感叹,不是女儿,胜似女儿,比小棉袄还体贴。 -## 运行该项目 -有两种方式可以运行我们的项目,先来看看第一种 +## 运行项目 +有两种方式可以运行项目,先来看看第一种. #### cargo run - -真的很简单,我就不废话了,在项目根目录下运行: - +一码胜似千言: ```console $ cargo run Compiling world_hello v0.1.0 (/Users/sunfei/development/rust/world_hello) @@ -55,41 +55,41 @@ $ cargo run Hello, world! ``` -好了,你已经看到程序的输出: `"Hello, world"`, 可能有读者不愿意了,说好了"世界,你好"呢? 别急,在下一节,我们再对代码进行修改。 +好了,你已经看到程序的输出: `"Hello, world"`, 可能有读者不愿意了,说好了"世界,你好"呢? 别急,在下一节,我们再对代码进行修改。认真想来,"你好,世界“强调的是我对世界说你好,而"世界,你好“是世界对我说你好,明显是后者更有包容性和国际范儿,读者真·好眼光. -在上面的过程中,`cargo run`会对项目进行编译,然后再运行项目,如同我们下面将做的 +上述代码,`cargo run`首先对项目进行编译,然后再运行,因此它实际上等同于运行了两个指令,如同我们下面将做的 #### 手动编译和运行项目 -先来编译项目: +编译 ```console $ cargo build Finished dev [unoptimized + debuginfo] target(s) in 0.00s ``` -接着手动运行: +运行 ```console $ ./target/debug/world_hello Hello, world! ``` -很简单对吧?细心的读者可能已经发现,在调用的时候,路径`./target/debug/world_hello`中有一个明晃晃的`debug`字段,没错我们运行的是`debug模式`,在这种模式下,**代码的编译速度会非常快**,但是**运行速度就比较慢**了,原因在于这个模式下,Rust编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。 +行云流水,但谈不上一气呵成. 细心的读者可能已经发现,在调用的时候,路径`./target/debug/world_hello`中有一个明晃晃的`debug`字段,没错我们运行的是`debug模式`,在这种模式下,**代码的编译速度会非常快**,可是福兮祸所依,**运行速度就慢了**. 原因是,在`debug`模式下,Rust编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。 -那如果我们想要高性能的代码怎么办?可以添加`--release`来编译: +作为尊贵的读者,咱自然可以要求更多,比如你想要高性能的代码怎么办? 简单,添加`--release`来编译: - `cargo run --release` - `cargo build --release` -如果你用的第二个命令,就要换一个路径来运行程序 + +运行我们的高性能`relese`程序: ```console $ ./target/release/world_hello Hello, world! ``` -当项目大了后,`cargo run`和`cargo build`不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着! - ## cargo check +当项目大了后,`cargo run`和`cargo build`不可避免的会变慢,那么有没有更快的方式来验证代码的正确性呢?大杀器来了,接着! -`cargo check`是我们在代码开发过程中用的最多的命令,它的作用很简单:快速的检查一下代码能否编译通过,所以速度会非常快,帮助我们节省大量的编译时间(毕竟Rust不是Go,需要做很多复杂的编译优化和语言特性解析,所以编译速度比Go慢了不少)。 +`cargo check`是我们在代码开发过程中最常用的命令,它的作用很简单:快速的检查一下代码能否编译通过. 因此该命令速度会非常快,能节省大量的编译时间. ```console $ cargo check @@ -97,20 +97,23 @@ $ cargo check 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项目代码管理的核心文件,cargo工具的所有活动均基于这两个文件。 +`cargo.toml`和`cargo.lock`是`cargo`的核心文件,它的所有活动均基于此二者。 `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.toml`文件,我们来简单介绍下: +现在用Vscode打开上面创建的"世界,你好"项目,然后进入根目录的`cargo.toml`文件,该文件包含不少信息。 #### package配置段落 -`package`中配置了我们项目的一些描述信息,典型的如下: +`package`中记录了项目的描述信息,典型的如下: ```toml [package] @@ -119,12 +122,12 @@ version = "0.1.0" 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,通过版本说明来描述 - 基于项目源代码的git仓库地址,通过URL来描述 @@ -140,13 +143,13 @@ color = { git = "https://github.com/bjz/color-rs" } 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项目的创建和管理已经有了初步的了解,那么来完善刚才的`"世界,你好"`项目吧。 \ No newline at end of file diff --git a/src/first-try/editor.md b/src/first-try/editor.md index 414c1478..b352fdd7 100644 --- a/src/first-try/editor.md +++ b/src/first-try/editor.md @@ -1,8 +1,10 @@ ## 墙推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,以下内容引用于官网: @@ -14,24 +16,24 @@ VScode从15年刚开始推出,我就在使用了,做为第一个吃螃蟹的 1. 官方的`Rust`,作者是`The Rust Programming Language`, 官方出品,牛逼就完了,但是。。。我们并不推荐,这个插件有几个问题: - 首先是在代码跳转上支持的很烂,只能在自己的代码库中跳转,一旦跳到别的三方库,那就无法继续跳转,对于查看标准库和三方库的源码带来了极大的困扰 - 其次,不支持类型自动标注,对于Rust语言而言,类型说明是非常重要的,特别是在你不知道给变量一个什么类型时,这种IDE的自动提示就变得弥足珍贵 -- 代码提示不太好用,有些方法即不提示,也不能跳转 +- 代码提示不太好用,有些方法既不会提示,也不能跳转 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`,这个报错是因为网络原因导致,很可能是你的网络不行或者翻墙工具阻拦你的访问,试着关掉翻墙,再进行尝试 ## 安装其它好用的插件 在此,再推荐大家几个好用的插件: -1. Better TOML,用于更好的展示.toml文件 -2. Error Lens, 更好的获得错误展示 -3. One Dark Pro, 非常好看的Vscode主题 -4. CodeLLDB, debugger程序 +1. `Better TOML`,用于更好的展示.toml文件 +2. `Error Lens`, 更好的获得错误展示 +3. `One Dark Pro`, 非常好看的Vscode主题 +4. `CodeLLDB`, debugger程序 好了,至此,Vscode的配置就已经全部结束,是不是很简单?下面让我们来用Cargo创建一个Rust项目,然后用Vscode打开. \ No newline at end of file diff --git a/src/first-try/hello-world.md b/src/first-try/hello-world.md index 91562bb4..f33dc07a 100644 --- a/src/first-try/hello-world.md +++ b/src/first-try/hello-world.md @@ -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 fn greet_world() { let southern_germany = "Grüß Gott!"; @@ -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,22 +37,20 @@ World, hello 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这门语言对于Haskell和Java开发来说,会觉得很熟悉,因为它们在高阶表达方面都很优秀,简而言之,可以很简洁的写出原本需要一大堆代码才能表达的含义,但是Rust又有所不同:它的性能是底层语言级别的性能,可以跟C/C++相媲美。 -在上一节,咱们学习了非常简单的Rust入门代码,现在来点复杂的,然后说说你对Rust的初印象。 - -下面的例子是关于基础文本处理: +上一句的`so easy`的余音仍在绕梁,我希望它能继续下去,可是。。。人总是要面对现实,因此让我们来些狠的: ```rust fn main() { let penguin_data = "\ @@ -97,19 +95,19 @@ fn main() { } ``` -上面代码中值得注意的Rust特性有: +看完这段代码,不知道你的余音有没有嘎然而止,反正我已经在颤抖了,这就是传说中的下马威嘛?上面代码中值得注意的Rust特性有: - 控制流:`for`和`continue`在一起,实现的循环 -- 方法语法:由于Rust没有继承,因此Rust不是传统意义上的面向对象语言,但是它却从OO语言那里偷师了方法的使用`record.trim()`,`record.split(',')`等 +- 方法语法:由于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/statement-expression.md) +- 条件编译: `if cfg!(debug_assertions)`,说明紧跟其后的输出打印只在`debug`模式下生效 +- 隐式返回: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安装入门就已经结束,相信看到这里,你已经发现了本书与其它书的区别,其中最大的区别就是:**这本书就像优秀的国外课本一样,不太枯燥,也希望这本不太枯燥的书,能伴你长行,犹如一杯奶茶,细细品之,唇齿余香**。 diff --git a/src/first-try/installation.md b/src/first-try/installation.md index eed29215..1e006461 100644 --- a/src/first-try/installation.md +++ b/src/first-try/installation.md @@ -4,7 +4,7 @@ > haha,开个玩笑,读者乃大大,怎么能弃之不顾,所以,注意:如果你不想用或者不能用rustup,请参见[Rust其它安装方法](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods) -现在Rust稳定版特性越来越全了,所以下载最新稳定版本即可。由于你用的Rust版本可能跟本书写的时候不一样,所以一些编译错误和警告可能也会有所不同。 +现在Rust稳定版特性越来越全了,因此下载最新稳定版本即可。由于你用的Rust版本可能跟本书写的时候不一样,一些编译错误和警告可能也会有所不同。 ### 在 Linux 或 macOS 上安装 `rustup` @@ -15,36 +15,33 @@ $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh ``` -这个命令将下载一个脚本并开始安装 `rustup` 工具,此工具将安装 `Rust` 的最新稳定版本。可能会提示你输入管理员密码。如果安装成功,将出现下面这行: +这个命令将下载一个脚本并开始安装 `rustup` 工具,此工具将安装 `Rust` 的最新稳定版本。可能会提示你输入管理员密码, 如果安装成功,将出现下面这行: ```text Rust is installed now. Great! ``` +注意,上面已经完成了Rust安装,**假如在安装过程中遇到连接器错误,请继续往下看**,否则可以直接跳到[更新和卸载](#更新和卸载),继续阅读. -注意,上面已经完成了Rust安装,**如果你在安装过程中遇到连接器错误,请继续往下看**,否则可以直接跳到[更新和卸载](#更新和卸载),继续阅读. - -Rust对运行环境和Go语言很像,几乎所有环境都可以无需安装任何依赖直接运行,但是,Rust会依赖libc和链接器linker,所以如果遇到了提示链接器无法执行的错误,你需要手动安装一个C语言编译器即可: +Rust对运行环境和Go语言很像,几乎所有环境都可以无需安装任何依赖直接运行,但是,Rust会依赖`libc`和链接器`linker`,所以如果遇到了提示链接器无法执行的错误,你需要手动安装一个C语言编译器: **在Macos下** ```console $ xcode-select --install ``` **在linux下** -Linux 用户一般应按照相应发行版的文档来安装 GCC 或 Clang。例如,如果你使用 Ubuntu,则可安装 `build-essential`。 +Linux 用户一般应按照相应发行版的文档来安装`GCC`或`Clang`。例如,如果你使用 Ubuntu,则可安装 `build-essential`。 ### 在 Windows 上安装 `rustup` -windows上安装过程较为麻烦,因此我们专门写了一篇文章来讲解相关的安装过程,请参考:[Windows安装](https://blog.csdn.net/erlib/article/details/121684998?spm=1001.2014.3001.5501). - - -windows上安装要求有`c++`环境,以下为安装的两种方式 +windows上安装Rust需要有`c++`环境,以下为安装的两种方式: **1、x86_64-pc-windows-msvc(官方推荐)** -先安装 [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安装程序,一路默认就好。 +先安装 [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安装程序, 一路默认即可。 ``` shell PS C:\Users\Hehongyuan> rustup-init.exe @@ -60,14 +57,15 @@ Current installation options: 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation - ``` **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) -个人习惯使用 [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` 即可 +该类型的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` 即可: 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 $ rustup update ``` -要卸载 `Rust` 和 `rustup`,在 shell 中运行以下卸载命令: +要卸载 `Rust` 和 `rustup`,在终端中运行以下卸载命令: ```console $ rustup self uninstall ``` -### 疑难解答 +### 检查安装是否成功 -要检查是否正确安装了 Rust,可打开 shell 并输入下面这行,你应该看到最新发布的稳定版本的版本号、提交哈希值和提交日期: +检查是否正确安装了 Rust,可打开终端并输入下面这行, 此时能看到最新发布的稳定版本的版本号、提交哈希值和提交日期: ```console $ rustc -V 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) \ No newline at end of file +每当遇到标准库提供的类型或函数不知道怎么用时,都可以在 API 文档中查找到!具体参见[在标准库寻找你想要的内容](../std/search.md) \ No newline at end of file diff --git a/src/first-try/intro.md b/src/first-try/intro.md index d28292be..922056bc 100644 --- a/src/first-try/intro.md +++ b/src/first-try/intro.md @@ -1,6 +1,6 @@ # 寻找牛刀,以便小试 -其实对于写这种章节,我内心是拒绝的,因为真的很无趣,对于一本书而言,这也更像是一种浪费纸张的行为(好在咱无纸化:-D),不过没有办法,没有Rust,总不能让大家用空气运行吧, so, 我恶趣味的起了一个这样的章节名。 +其实对于写这种章节,我内心是拒绝的,因为真的很无趣,对于一本书而言,这也更像是一种浪费纸张的行为(好在咱无纸化:-D),不过没有办法,如果不安装Rust环境,总不能让大家用空气运行吧, so, 我恶趣味的起了一个这样的章节名。 在本章中,你将学习以下内容: 1. 在Macos、Linux、Windows上安装Rust以及相关工具链