mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2025-04-20 11:48:01 +08:00
ch10-02语句调整+错别字
This commit is contained in:
parent
7b98482915
commit
0bac596862
17
src/.vuepress/dist/404.html
vendored
Normal file
17
src/.vuepress/dist/404.html
vendored
Normal file
File diff suppressed because one or more lines are too long
17
src/.vuepress/dist/PREFACE.html
vendored
Normal file
17
src/.vuepress/dist/PREFACE.html
vendored
Normal file
File diff suppressed because one or more lines are too long
17
src/.vuepress/dist/SUMMARY.html
vendored
Normal file
17
src/.vuepress/dist/SUMMARY.html
vendored
Normal file
File diff suppressed because one or more lines are too long
18
src/.vuepress/dist/appendix-00.html
vendored
Normal file
18
src/.vuepress/dist/appendix-00.html
vendored
Normal file
File diff suppressed because one or more lines are too long
20
src/.vuepress/dist/appendix-01-keywords.html
vendored
Normal file
20
src/.vuepress/dist/appendix-01-keywords.html
vendored
Normal file
File diff suppressed because one or more lines are too long
18
src/.vuepress/dist/appendix-02-operators.html
vendored
Normal file
18
src/.vuepress/dist/appendix-02-operators.html
vendored
Normal file
File diff suppressed because one or more lines are too long
18
src/.vuepress/dist/appendix-03-derivable-traits.html
vendored
Normal file
18
src/.vuepress/dist/appendix-03-derivable-traits.html
vendored
Normal file
File diff suppressed because one or more lines are too long
123
src/.vuepress/dist/appendix-04-macros.html
vendored
Normal file
123
src/.vuepress/dist/appendix-04-macros.html
vendored
Normal file
File diff suppressed because one or more lines are too long
18
src/.vuepress/dist/appendix-05-translation.html
vendored
Normal file
18
src/.vuepress/dist/appendix-05-translation.html
vendored
Normal file
File diff suppressed because one or more lines are too long
80
src/.vuepress/dist/appendix-06-newest-features.html
vendored
Normal file
80
src/.vuepress/dist/appendix-06-newest-features.html
vendored
Normal file
File diff suppressed because one or more lines are too long
17
src/.vuepress/dist/appendix-07-nightly-rust.html
vendored
Normal file
17
src/.vuepress/dist/appendix-07-nightly-rust.html
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/css/0.styles.8614bbde.css
vendored
Normal file
1
src/.vuepress/dist/assets/css/0.styles.8614bbde.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/img/search.83621669.svg
vendored
Normal file
1
src/.vuepress/dist/assets/img/search.83621669.svg
vendored
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#aaa" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
|
After Width: | Height: | Size: 216 B |
1
src/.vuepress/dist/assets/js/10.d41a3b84.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/10.d41a3b84.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{269:function(r,t,e){"use strict";e.r(t);var n=e(0),o=Object(n.a)({},function(){var r=this,t=r.$createElement,e=r._self._c||t;return e("div",{staticClass:"content"},[r._m(0),r._v(" "),e("blockquote",[e("p",[e("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/appendix-05-translation.md",target:"_blank",rel:"noopener noreferrer"}},[r._v("appendix-05-translation.md"),e("OutboundLink")],1),r._v(" "),e("br"),r._v("\ncommit 9c3756a33e6c1aa07a762ffa853fcdfcffb48ddc")])]),r._v(" "),e("p",[r._v("一些非英语语言的资源。多数仍在翻译中;查阅"),e("a",{attrs:{href:"https://github.com/rust-lang/book/issues?q=is%3Aopen+is%3Aissue+label%3ATranslations",target:"_blank",rel:"noopener noreferrer"}},[r._v("翻译标签"),e("OutboundLink")],1),r._v("来帮助我们或使我们知道新的翻译!")]),r._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/rust-br/rust-book-pt-br",target:"_blank",rel:"noopener noreferrer"}},[r._v("Português"),e("OutboundLink")],1),r._v(" (BR)")]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/nunojesus/rust-book-pt-pt",target:"_blank",rel:"noopener noreferrer"}},[r._v("Português"),e("OutboundLink")],1),r._v(" (PT)")]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/hngnaig/rust-lang-book/tree/vi-VN",target:"_blank",rel:"noopener noreferrer"}},[r._v("Tiếng việt"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/KaiserY/trpl-zh-cn",target:"_blank",rel:"noopener noreferrer"}},[r._v("简体中文"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/pavloslav/rust-book-uk-ua",target:"_blank",rel:"noopener noreferrer"}},[r._v("Українська"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/thecodix/book",target:"_blank",rel:"noopener noreferrer"}},[r._v("Español"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/AgeOfWar/rust-book-it",target:"_blank",rel:"noopener noreferrer"}},[r._v("Italiano"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/iDeBugger/rust-book-ru",target:"_blank",rel:"noopener noreferrer"}},[r._v("Русский"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/rinthel/rust-lang-book-ko",target:"_blank",rel:"noopener noreferrer"}},[r._v("한국어"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/hazama-yuinyan/book",target:"_blank",rel:"noopener noreferrer"}},[r._v("日本語"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/quadrifoglio/rust-book-fr",target:"_blank",rel:"noopener noreferrer"}},[r._v("Français"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/paytchoo/book-pl",target:"_blank",rel:"noopener noreferrer"}},[r._v("Polski"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/idanmel/rust-book-heb",target:"_blank",rel:"noopener noreferrer"}},[r._v("עברית"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/agentzero1/book",target:"_blank",rel:"noopener noreferrer"}},[r._v("Cebuano"),e("OutboundLink")],1)]),r._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/josephace135/book",target:"_blank",rel:"noopener noreferrer"}},[r._v("Tagalog"),e("OutboundLink")],1)])])])},[function(){var r=this.$createElement,t=this._self._c||r;return t("h2",{attrs:{id:"附录e-本书翻译"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#附录e-本书翻译","aria-hidden":"true"}},[this._v("#")]),this._v(" 附录E - 本书翻译")])}],!1,null,null,null);o.options.__file="appendix-05-translation.md";t.default=o.exports}}]);
|
1
src/.vuepress/dist/assets/js/100.22ca6861.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/100.22ca6861.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/101.80606dd4.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/101.80606dd4.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/102.75bf264b.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/102.75bf264b.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/103.7615fac4.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/103.7615fac4.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{246:function(e,t,r){"use strict";r.r(t);var s=r(0),n=Object(s.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/ch20-00-final-project-a-web-server.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ch20-00-final-project-a-web-server.md"),r("OutboundLink")],1),e._v(" "),r("br"),e._v("\ncommit e2a38b44f3a7f796fa8000e558dc8dd2ddf340a3")])]),e._v(" "),r("p",[e._v("这是一次漫长的旅途,不过我们做到了!这一章便是本书的结束。离别是如此甜蜜的悲伤。不过在我们结束之前,再来一起构建另一个项目,来展示最后几章所学,同时复习更早的章节。")]),e._v(" "),r("p",[e._v("作为最后的项目,我们将要实现一个只返回 “hello” 的 web server;它在浏览器中看起来就如图例 20-1 所示:")]),e._v(" "),e._m(1),e._v(" "),e._m(2),e._v(" "),r("p",[e._v("如下是我们将怎样构建此 web server 的计划:")]),e._v(" "),e._m(3),e._v(" "),e._m(4),e._v(" "),r("p",[e._v("然而,本章的目的在于学习,而不是走捷径。因为 Rust 是一个系统编程语言,我们能够选择处理什么层次的抽象,并能够选择比其他语言可能或可用的层次更低的层次。因此我们将自己编写一个基础的 HTTP server 和线程池,以便学习将来可能用到的 crate 背后的通用理念和技术。")])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"最后的项目-构建多线程-web-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#最后的项目-构建多线程-web-server","aria-hidden":"true"}},[this._v("#")]),this._v(" 最后的项目: 构建多线程 web server")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:"img/trpl20-01.png",alt:"hello from rust"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("span",{staticClass:"caption"},[this._v("图例 20-1: 我们最好将一起分享的项目")])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ol",[r("li",[e._v("学习一些 TCP 与 HTTP 知识")]),e._v(" "),r("li",[e._v("在套接字(socket)上监听 TCP 请求")]),e._v(" "),r("li",[e._v("解析少量的 HTTP 请求")]),e._v(" "),r("li",[e._v("创建一个合适的 HTTP 响应")]),e._v(" "),r("li",[e._v("通过线程池改善 server 的吞吐量")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("不过在开始之前,需要提到一点:这里使用的方法并不是使用 Rust 构建 web server 最好的方法。"),t("em",[this._v("https://crates.io")]),this._v(" 上有很多可用于生产环境的 crate,它们提供了比我们所要编写的更为完整的 web server 和线程池实现。")])}],!1,null,null,null);n.options.__file="ch20-00-final-project-a-web-server.md";t.default=n.exports}}]);
|
1
src/.vuepress/dist/assets/js/104.a030e309.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/104.a030e309.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/105.ceb5b0f7.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/105.ceb5b0f7.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/106.53b25747.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/106.53b25747.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/107.a6f25383.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/107.a6f25383.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/108.524846e6.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/108.524846e6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/109.5b3e8cc8.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/109.5b3e8cc8.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/11.7f9bf643.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/11.7f9bf643.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/110.a106958d.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/110.a106958d.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/111.b1600e65.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/111.b1600e65.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{230:function(t,e,s){"use strict";s.r(e);var r=s(0),n=Object(r.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/foreword.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("foreword.md"),s("OutboundLink")],1),t._v(" "),s("br"),t._v("\ncommit 5e085bd1add34aec03416e891751552b439dde52")])]),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("比如,“系统层面”(“systems-level”)的工作,涉及内存管理、数据表示和并发等底层细节。从传统角度来看,这是一个神秘的编程领域,只为浸淫多年的极少数人所触及,也只有他们能避开那些臭名昭著的陷阱。即使谨慎的实践者,亦唯恐代码出现漏洞、崩溃或损坏。")]),t._v(" "),s("p",[t._v("Rust 破除了这些障碍,其消除了旧的陷阱并提供了伴你一路同行的友好、精良的工具。想要 “深入” 底层控制的程序员可以使用 Rust,无需冒着常见的崩溃或安全漏洞的风险,也无需学习时常改变的工具链的最新知识。其语言本身更是被设计为自然而然的引导你编写出在运行速度和内存使用上都十分高效的可靠代码。")]),t._v(" "),s("p",[t._v("已经在从事编写底层代码的程序员可以使用 Rust 来提升抱负。例如,在 Rust 中引入并行是相对低风险的操作:编译器会为你捕获经典的错误。同时你可以自信的采取更为积极的优化,而不会意外引入崩溃或漏洞。")]),t._v(" "),s("p",[t._v("但 Rust 并不局限于底层系统编程。其表现力和工效足以令人愉悦的编写出 CLI 应用、web server 和很多其他类型的代码 —— 在本书中你会看到两个简单示例。使用 Rust 能将你在一个领域中学习的技能延伸到另一个领域;你可以学习 Rust 来编写 web 应用,接着将同样的技能应用到你的 Raspberry Pi(树莓派)上。")]),t._v(" "),s("p",[t._v("本书全面介绍了 Rust 为用户赋予的能力。其内容平易近人,致力于帮助你提升 Rust 的知识,并且提升你作为程序员整体的理解与自信。那么让我们准备深入学习 Rust 吧(打开新世界的大门 😃) —— 欢迎加入 Rust 社区!")]),t._v(" "),s("p",[t._v("— Nicholas Matsakis 和 Aaron Turon")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"前言"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#前言","aria-hidden":"true"}},[this._v("#")]),this._v(" 前言")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("虽然不是那么明显,但 Rust 程序设计语言的本质在于 "),e("strong",[this._v("赋能")]),this._v("("),e("em",[this._v("empowerment")]),this._v("):无论你现在编写的是何种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。")])}],!1,null,null,null);n.options.__file="foreword.md";e.default=n.exports}}]);
|
1
src/.vuepress/dist/assets/js/112.81bf40f0.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/112.81bf40f0.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{166:function(n,w,o){}}]);
|
1
src/.vuepress/dist/assets/js/12.c7e4d9a8.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/12.c7e4d9a8.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{275:function(t,s,e){"use strict";e.r(s);var i=e(0),n=Object(i.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h2",{attrs:{id:"g-rust-是如何开发的与-“nightly-rust”"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#g-rust-是如何开发的与-“nightly-rust”","aria-hidden":"true"}},[this._v("#")]),this._v(" G - Rust 是如何开发的与 “Nightly Rust”")])])}],!1,null,null,null);n.options.__file="appendix-07-nightly-rust.md";s.default=n.exports}}]);
|
1
src/.vuepress/dist/assets/js/13.235bc06a.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/13.235bc06a.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/14.8b8a21b7.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/14.8b8a21b7.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{274:function(t,e,r){"use strict";r.r(e);var n=r(0),s=Object(n.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch01-00-getting-started.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch01-00-getting-started.md"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),t._v(" "),r("p",[t._v("让我们开始 Rust 之旅!有很多内容需要学习,但每次旅程总有起点。在本章中,我们会讨论:")]),t._v(" "),t._m(1)])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"入门指南"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#入门指南","aria-hidden":"true"}},[this._v("#")]),this._v(" 入门指南")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ul",[r("li",[t._v("在 Linux、macOS 和 Windows 上安装 Rust")]),t._v(" "),r("li",[t._v("编写一个打印 "),r("code",[t._v("Hello, world!")]),t._v(" 的程序")]),t._v(" "),r("li",[t._v("使用 Rust 的包管理器和构建系统 "),r("code",[t._v("cargo")])])])}],!1,null,null,null);s.options.__file="ch01-00-getting-started.md";e.default=s.exports}}]);
|
1
src/.vuepress/dist/assets/js/15.83a607fc.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/15.83a607fc.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/16.2bf746d6.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/16.2bf746d6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/17.36a5d5f3.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/17.36a5d5f3.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/18.82e00fba.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/18.82e00fba.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/19.1c2116c8.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/19.1c2116c8.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{267:function(t,e,s){"use strict";s.r(e);var r=s(0),i=Object(r.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch03-00-common-programming-concepts.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch03-00-common-programming-concepts.md"),s("OutboundLink")],1),t._v(" "),s("br"),t._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),t._v(" "),s("p",[t._v("本章介绍一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 上下文中讨论它们,并解释使用这些概念的惯例。")]),t._v(" "),s("p",[t._v("具体来说,我们将会学习变量、基本类型、函数、注释和控制流。每一个 Rust 程序中都会用到这些基础知识,提早学习这些概念会让你在起步时就打下坚实的基础。")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),s("p",[t._v("这里我们将对本书中的一些概念做一些解释:变量、函数、结构体等等。所有这些都需要名称。Rust 中的名称被称为 “标识符”(“identifier”),它们可以是任意非空的 ASCII 字符串,不过有如下限制:")]),t._v(" "),s("p",[t._v("要么是:")]),t._v(" "),t._m(4),t._v(" "),s("p",[t._v("或者是:")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._m(9)])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"通用编程概念"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#通用编程概念","aria-hidden":"true"}},[this._v("#")]),this._v(" 通用编程概念")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"关键字"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#关键字","aria-hidden":"true"}},[this._v("#")]),this._v(" 关键字")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Rust 语言有一组保留的 "),e("strong",[this._v("关键字")]),this._v("("),e("em",[this._v("keywords")]),this._v("),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在附录 A 中找到关键字的列表。")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"标识符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#标识符","aria-hidden":"true"}},[this._v("#")]),this._v(" 标识符")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("第一个字符是字母。")]),this._v(" "),e("li",[this._v("其它字符是字母数字或者 _。")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("第一个字符是 _。")]),this._v(" "),e("li",[this._v("标识符需多于一个字符。单独的 _ 不是标识符。")]),this._v(" "),e("li",[this._v("其它字符是字母数字或者 _。")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"原始标识符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#原始标识符","aria-hidden":"true"}},[this._v("#")]),this._v(" 原始标识符")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("有时出于某种原因你可能需要将关键字作为名称。比如你需要调用 C 语言库中名为 "),e("em",[this._v("match")]),this._v(" 的函数,在 C 语言中 "),e("em",[this._v("match")]),this._v(" 不是关键字。为此你可以使用 “原始标识符”(“raw identifier”)。原始标识符以 "),e("code",[this._v("r#")]),this._v(" 开头:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-rust,ignore extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("let r#fn = \"this variable is named 'fn' even though that's a keyword\";\n\n// 调用名为 'match' 的函数\nr#match();\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("你无需经常用到原始标识符,但是当你 "),e("strong",[this._v("真正")]),this._v(" 需要它们时可以这么做。")])}],!1,null,null,null);i.options.__file="ch03-00-common-programming-concepts.md";e.default=i.exports}}]);
|
1
src/.vuepress/dist/assets/js/2.3505b190.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/2.3505b190.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{164:function(t,e,n){},165:function(t,e,n){"use strict";var a=n(164);n.n(a).a},221:function(t,e,n){"use strict";n.r(e);var a={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,a=e.slots;return t("span",{class:["badge",n.type,n.vertical]},n.text||a().default)}},i=(n(165),n(0)),o=Object(i.a)(a,void 0,void 0,!1,null,"c23f6ad2",null);o.options.__file="Badge.vue";e.default=o.exports}}]);
|
1
src/.vuepress/dist/assets/js/20.1f4e3d0f.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/20.1f4e3d0f.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/21.80dca6df.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/21.80dca6df.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/22.24977f4c.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/22.24977f4c.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/23.867b53ea.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/23.867b53ea.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{261:function(t,s,n){"use strict";n.r(s);var a=n(0),e=Object(a.a)({},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),n("blockquote",[n("p",[n("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch03-04-comments.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch03-04-comments.md"),n("OutboundLink")],1),t._v(" "),n("br"),t._v("\ncommit a86c1d315789b3ca13b20d50ad5005c62bdd9e37")])]),t._v(" "),t._m(1),t._v(" "),n("p",[t._v("这是一个简单的注释:")]),t._v(" "),t._m(2),t._m(3),t._v(" "),t._m(4),n("p",[t._v("注释也可以在放在包含代码的行的末尾:")]),t._v(" "),t._m(5),t._v(" "),t._m(6),n("p",[t._v("不过你更经常看到以这种格式使用它们,也就是位于它所解释的代码行的上面一行:")]),t._v(" "),t._m(7),t._v(" "),t._m(8),n("p",[t._v("Rust 还有另一种注释,称为文档注释,我们将在 14 章讨论它。")])])},[function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"注释"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#注释","aria-hidden":"true"}},[this._v("#")]),this._v(" 注释")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("所有程序员都力求使其代码易于理解,不过有时还需要提供额外的解释。在这种情况下,程序员在源码中留下记录,或者 "),s("strong",[this._v("注释")]),this._v("("),s("em",[this._v("comments")]),this._v("),编译器会忽略它们,不过阅读代码的人可能觉得有用。")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{attrs:{class:"token comment"}},[this._v("// hello, world")]),this._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("在 Rust 中,注释必须以两道斜杠开始,并持续到本行的结尾。对于超过一行的注释,需要在每一行前都加上 "),s("code",[this._v("//")]),this._v(",像这样:")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"language-rust extra-class"},[s("pre",{pre:!0,attrs:{class:"language-rust"}},[s("code",[s("span",{attrs:{class:"token comment"}},[this._v("// So we’re doing something complicated here, long enough that we need")]),this._v("\n"),s("span",{attrs:{class:"token comment"}},[this._v("// multiple lines of comments to do it! Whew! Hopefully, this comment will")]),this._v("\n"),s("span",{attrs:{class:"token comment"}},[this._v("// explain what’s going on.")]),this._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("span",{staticClass:"filename"},[this._v("文件名: src/main.rs")])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-rust extra-class"},[n("pre",{pre:!0,attrs:{class:"language-rust"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("main")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("let")]),t._v(" lucky_number "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token number"}},[t._v("7")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{attrs:{class:"token comment"}},[t._v("// I’m feeling lucky today")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("span",{staticClass:"filename"},[this._v("文件名: src/main.rs")])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-rust extra-class"},[n("pre",{pre:!0,attrs:{class:"language-rust"}},[n("code",[n("span",{attrs:{class:"token keyword"}},[t._v("fn")]),t._v(" "),n("span",{attrs:{class:"token function"}},[t._v("main")]),n("span",{attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{attrs:{class:"token comment"}},[t._v("// I’m feeling lucky today")]),t._v("\n "),n("span",{attrs:{class:"token keyword"}},[t._v("let")]),t._v(" lucky_number "),n("span",{attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{attrs:{class:"token number"}},[t._v("7")]),n("span",{attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])}],!1,null,null,null);e.options.__file="ch03-04-comments.md";s.default=e.exports}}]);
|
1
src/.vuepress/dist/assets/js/24.d59d9203.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/24.d59d9203.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/25.fae2b839.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/25.fae2b839.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{258:function(t,e,s){"use strict";s.r(e);var n=s(0),r=Object(n.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("blockquote",[e("p",[e("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch04-00-understanding-ownership.md",target:"_blank",rel:"noopener noreferrer"}},[this._v("ch04-00-understanding-ownership.md"),e("OutboundLink")],1),this._v(" "),e("br"),this._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),this._v(" "),e("p",[this._v("所有权(系统)是 Rust 最独特的功能,其令 Rust 无需垃圾回收(garbage collector)即可保障内存安全。因此,理解 Rust 中所有权如何工作是十分重要的。本章,我们将讲到所有权以及相关功能:借用、slice 以及 Rust 如何在内存中布局数据。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"认识所有权"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#认识所有权","aria-hidden":"true"}},[this._v("#")]),this._v(" 认识所有权")])}],!1,null,null,null);r.options.__file="ch04-00-understanding-ownership.md";e.default=r.exports}}]);
|
1
src/.vuepress/dist/assets/js/26.ba769edc.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/26.ba769edc.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/27.03216770.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/27.03216770.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/28.82b934bf.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/28.82b934bf.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/29.9bbe7e55.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/29.9bbe7e55.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{252:function(t,e,s){"use strict";s.r(e);var r=s(0),c=Object(r.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("blockquote",[e("p",[e("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch05-00-structs.md",target:"_blank",rel:"noopener noreferrer"}},[this._v("ch05-00-structs.md"),e("OutboundLink")],1),this._v(" "),e("br"),this._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),this._v(" "),this._m(1)])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"使用结构体组织相关联的数据"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#使用结构体组织相关联的数据","aria-hidden":"true"}},[this._v("#")]),this._v(" 使用结构体组织相关联的数据")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("p",[s("em",[t._v("struct")]),t._v(",或者 "),s("em",[t._v("structure")]),t._v(",是一个自定义数据类型,允许你命名和包装多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言,"),s("em",[t._v("struct")]),t._v(" 就像对象中的数据属性。在本章中,我们会对比元组与结构体的异同,演示结构体的用法,并讨论如何在结构体上定义方法和关联函数来指定与结构体数据相关的行为。你在程序中基于结构体和枚举("),s("em",[t._v("enum")]),t._v(")(在第六章介绍)创建新类型,以充分利用 Rust 的编译时类型检查。")])}],!1,null,null,null);c.options.__file="ch05-00-structs.md";e.default=c.exports}}]);
|
1
src/.vuepress/dist/assets/js/3.ba62e17c.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/3.ba62e17c.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{248:function(t,s,e){"use strict";e.r(s);var n=e(0),i=Object(n.a)({},function(){this.$createElement;this._self._c;return this._m(0)},[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h1",{attrs:{id:"rust-程序设计语言(第二版)-简体中文版"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#rust-程序设计语言(第二版)-简体中文版","aria-hidden":"true"}},[this._v("#")]),this._v(" Rust 程序设计语言(第二版) 简体中文版")])])}],!1,null,null,null);i.options.__file="PREFACE.md";s.default=i.exports}}]);
|
1
src/.vuepress/dist/assets/js/30.ed75778f.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/30.ed75778f.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/31.247a3dbb.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/31.247a3dbb.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/32.b1bb1e43.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/32.b1bb1e43.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/33.3656c740.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/33.3656c740.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{241:function(t,e,n){"use strict";n.r(e);var s=n(0),r=Object(s.a)({},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),n("blockquote",[n("p",[n("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch06-00-enums.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch06-00-enums.md"),n("OutboundLink")],1),t._v(" "),n("br"),t._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),t._v(" "),t._m(1),t._v(" "),t._m(2)])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"枚举和模式匹配"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#枚举和模式匹配","aria-hidden":"true"}},[this._v("#")]),this._v(" 枚举和模式匹配")])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("p",[t._v("本章介绍 "),n("strong",[t._v("枚举")]),t._v("("),n("em",[t._v("enumerations")]),t._v("),也被称作 "),n("em",[t._v("enums")]),t._v("。枚举允许你通过列举可能的值来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 "),n("code",[t._v("Option")]),t._v(",它代表一个值要么是某个值要么什么都不是。然后会讲到在 "),n("code",[t._v("match")]),t._v(" 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后会介绍 "),n("code",[t._v("if let")]),t._v(",另一个简洁方便处理代码中枚举的结构。")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("枚举是一个很多语言都有的功能,不过不同语言中其功能各不相同。Rust 的枚举与 F#、OCaml 和 Haskell 这样的函数式编程语言中的 "),e("strong",[this._v("代数数据类型")]),this._v("("),e("em",[this._v("algebraic data types")]),this._v(")最为相似。")])}],!1,null,null,null);r.options.__file="ch06-00-enums.md";e.default=r.exports}}]);
|
1
src/.vuepress/dist/assets/js/34.03c1b47c.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/34.03c1b47c.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/35.5af5d342.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/35.5af5d342.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/36.572a9496.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/36.572a9496.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/37.319db1b7.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/37.319db1b7.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{233:function(e,t,s){"use strict";s.r(t);var r=s(0),_=Object(r.a)({},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"content"},[e._m(0),e._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/ch07-00-modules.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ch07-00-packages-crates-and-modules.md"),s("OutboundLink")],1),e._v(" "),s("br"),e._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),e._v(" "),e._m(1),e._v(" "),s("p",[e._v("Rust 有一系列与作用域相关的功能。这有时被称为 “模块系统”(“the module system”),不过又不仅仅是模块:")]),e._v(" "),e._m(2),e._v(" "),s("p",[e._v("本章将会覆盖所有这些概念。很快我们就能像专家一样将命名引入作用域、定义作用域和将命名导出到作用域!")])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"包、crate-与-模块"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#包、crate-与-模块","aria-hidden":"true"}},[this._v("#")]),this._v(" 包、crate 与 模块")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("编写程序时一个核心的问题是 "),t("strong",[this._v("作用域")]),this._v("("),t("em",[this._v("scope")]),this._v("):在代码的某处编译器知道哪些变量名?允许调用哪些函数?这些变量引用的又是什么?")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("strong",[e._v("包")]),e._v("("),s("em",[e._v("Packages")]),e._v(")是 Cargo 的一个功能,它允许你构建、测试核分享 crate。")]),e._v(" "),s("li",[s("em",[e._v("Crates")]),e._v(" 是一个模块的树形结构,它形成了库或二进制项目。")]),e._v(" "),s("li",[s("strong",[e._v("模块")]),e._v("("),s("em",[e._v("Modules")]),e._v(")和 "),s("em",[e._v("use")]),e._v(" 关键字允许你控制作用域和路径的私有性。")]),e._v(" "),s("li",[s("strong",[e._v("路径")]),e._v("("),s("em",[e._v("path")]),e._v(")是一个命名例如结构体、函数或模块等项的方式")])])}],!1,null,null,null);_.options.__file="ch07-00-packages-crates-and-modules.md.md";t.default=_.exports}}]);
|
1
src/.vuepress/dist/assets/js/38.19837e80.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/38.19837e80.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/39.72675c02.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/39.72675c02.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{231:function(e,t,r){"use strict";r.r(t);var a=r(0),s=Object(a.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch07-01-packages-and-crates-for-making-libraries-and-executables.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ch07-01-mod-and-the-filesystem.md"),r("OutboundLink")],1),e._v(" "),r("br"),e._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),e._v(" "),e._m(1),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),e._m(4),e._m(5),e._v(" "),r("p",[e._v("一个包可以带有零个或一个库 crate 和任意多个二进制 crate。一个包中必须带有至少一个(库或者二进制)crate。")]),e._v(" "),e._m(6),e._v(" "),r("p",[e._v("接下来让我们讨论模块!")])])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"包和-crate-用来创建库和二进制项目"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#包和-crate-用来创建库和二进制项目","aria-hidden":"true"}},[this._v("#")]),this._v(" 包和 crate 用来创建库和二进制项目")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("让我们聊聊 "),t("strong",[this._v("模块")]),this._v(" 与 "),t("em",[this._v("crate")]),this._v("。下面是一个总结:")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("em",[e._v("crate")]),e._v(" 是一个二进制或库项目。")]),e._v(" "),r("li",[r("strong",[e._v("crate 根")]),e._v("("),r("em",[e._v("crate root")]),e._v(")是一个用来描述如何构建 crate 的文件。")]),e._v(" "),r("li",[r("strong",[e._v("包")]),e._v(" 带有 "),r("em",[e._v("Cargo.toml")]),e._v(" 文件用以描述如何构建一个或多个 crate。一个包中至多可以有一个库项目。")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("所以当运行 "),t("code",[this._v("cargo new")]),this._v(" 时是在创建一个包:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[this._v("$ cargo new my-project\n Created binary (application) `my-project` package\n$ ls my-project\nCargo.toml\nsrc\n$ ls my-project/src\nmain.rs\n")])])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v("因为 Cargo 创建了 "),r("em",[e._v("Cargo.toml")]),e._v(",这意味着现在我们有了一个包。如果查看 "),r("em",[e._v("Cargo.toml")]),e._v(" 的内容,会发现并没有提到 "),r("em",[e._v("src/main.rs")]),e._v("。然而,Cargo 的约定是如果在代表包的 "),r("em",[e._v("Cargo.toml")]),e._v(" 的同级目录下包含 "),r("em",[e._v("src")]),e._v(" 目录且其中包含 "),r("em",[e._v("main.rs")]),e._v(" 文件的话,Cargo 就知道这个包带有一个与包同名的二进制 crate,且 "),r("em",[e._v("src/main.rs")]),e._v(" 就是 crate 根。另一个约定如果包目录中包含 "),r("em",[e._v("src/lib.rs")]),e._v(",则包带有与其同名的库 crate,且 "),r("em",[e._v("src/lib.rs")]),e._v(" 是 crate 根。crate 根文件将由 Cargo 传递给 "),r("code",[e._v("rustc")]),e._v(" 来实际构建库或者二进制项目。")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("如果包同时包含 "),t("em",[this._v("src/main.rs")]),this._v(" 和 "),t("em",[this._v("src/lib.rs")]),this._v(",那么它带有两个 crate:一个库和一个二进制项目,同名。如果只有其中之一,则包将只有一个库或者二进制 crate。包可以带有多个二进制 crate,需将其文件置于 "),t("em",[this._v("src/bin")]),this._v(" 目录;每个文件将是一个单独的二进制 crate。")])}],!1,null,null,null);s.options.__file="ch07-01-packages-and-crates-for-making-libraries-and-executables.md";t.default=s.exports}}]);
|
1
src/.vuepress/dist/assets/js/4.f9a0ae28.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/4.f9a0ae28.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/40.d9f81c69.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/40.d9f81c69.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/41.184751dc.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/41.184751dc.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/42.9fa6eee5.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/42.9fa6eee5.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/43.b3333fb7.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/43.b3333fb7.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{227:function(t,e,n){"use strict";n.r(e);var r=n(0),o=Object(r.a)({},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),n("blockquote",[n("p",[n("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch08-00-common-collections.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch08-00-common-collections.md"),n("OutboundLink")],1),t._v(" "),n("br"),t._v("\ncommit 820ac357f6cf0e866e5a8e7a9c57dd3e17e9f8ca")])]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),n("p",[t._v("对于标准库提供的其他类型的集合,请查看"),n("a",{attrs:{href:"https://doc.rust-lang.org/std/collections",target:"_blank",rel:"noopener noreferrer"}},[t._v("文档"),n("OutboundLink")],1),t._v("。")]),t._v(" "),n("p",[t._v("我们将讨论如何创建和更新 vector、字符串和哈希 map,以及它们有什么特别之处。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"通用集合类型"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#通用集合类型","aria-hidden":"true"}},[this._v("#")]),this._v(" 通用集合类型")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Rust 标准库中包含一系列被称为 "),e("strong",[this._v("集合")]),this._v("("),e("em",[this._v("collections")]),this._v(")的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知并且可以随着程序的运行增长或缩小。每种集合都有着不同能力和代价,而为所处的场景选择合适的集合则是你将要始终成长的技能。在这一章里,我们将详细的了解三个在 Rust 程序中被广泛使用的集合:")])},function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ul",[n("li",[n("em",[t._v("vector")]),t._v(" 允许我们一个挨着一个地储存一系列数量可变的值")]),t._v(" "),n("li",[n("strong",[t._v("字符串")]),t._v("("),n("em",[t._v("string")]),t._v(")是一个字符的集合。我们之前见过 "),n("code",[t._v("String")]),t._v(" 类型,不过在本章我们将深入了解。")]),t._v(" "),n("li",[n("strong",[t._v("哈希 map")]),t._v("("),n("em",[t._v("hash map")]),t._v(")允许我们将值与一个特定的键(key)相关联。这是一个叫做 "),n("em",[t._v("map")]),t._v(" 的更通用的数据结构的特定实现。")])])}],!1,null,null,null);o.options.__file="ch08-00-common-collections.md";e.default=o.exports}}]);
|
1
src/.vuepress/dist/assets/js/44.97c13303.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/44.97c13303.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/45.8afb63d1.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/45.8afb63d1.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/46.ac497cb6.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/46.ac497cb6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/47.dc1178aa.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/47.dc1178aa.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{223:function(e,t,r){"use strict";r.r(t);var n=r(0),_=Object(n.a)({},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch09-00-error-handling.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("ch09-00-error-handling.md"),r("OutboundLink")],1),e._v(" "),r("br"),e._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),e._v(" "),r("p",[e._v("Rust 对可靠性的执着也延伸到了错误处理。错误对于软件来说是不可避免的,所以 Rust 有很多特性来处理出现错误的情况。在很多情况下,Rust 要求你承认出错的可能性并在编译代码之前就采取行动。这些要求使得程序更为健壮,它们确保了你会在将代码部署到生产环境之前就发现错误并正确地处理它们!")]),e._v(" "),e._m(1),e._v(" "),e._m(2)])},[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"错误处理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#错误处理","aria-hidden":"true"}},[this._v("#")]),this._v(" 错误处理")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v("Rust 将错误组合成两个主要类别:"),r("strong",[e._v("可恢复错误")]),e._v("("),r("em",[e._v("recoverable")]),e._v(")和 "),r("strong",[e._v("不可恢复错误")]),e._v("("),r("em",[e._v("unrecoverable")]),e._v(")。可恢复错误通常代表向用户报告错误和重试操作是合理的情况,比如未找到文件。不可恢复错误通常是 bug 的同义词,比如尝试访问超过数组结尾的位置。")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("p",[e._v("大部分语言并不区分这两类错误,并采用类似异常这样方式统一处理他们。Rust 并没有异常。相反,对于可恢复错误有 "),r("code",[e._v("Result<T, E>")]),e._v(" 值,以及 "),r("code",[e._v("panic!")]),e._v(",它在遇到不可恢复错误时停止程序执行。这一章会首先介绍 "),r("code",[e._v("panic!")]),e._v(" 调用,接着会讲到如何返回 "),r("code",[e._v("Result<T, E>")]),e._v("。此外,我们将探讨决定是尝试从错误中恢复还是停止执行时的注意事项。")])}],!1,null,null,null);_.options.__file="ch09-00-error-handling.md";t.default=_.exports}}]);
|
1
src/.vuepress/dist/assets/js/48.50b8e29c.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/48.50b8e29c.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/49.385dc110.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/49.385dc110.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/5.0204093a.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/5.0204093a.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{254:function(t,e,s){"use strict";s.r(e);var i=s(0),n=Object(i.a)({},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"content"},[this._m(0),this._v(" "),e("blockquote",[e("p",[e("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/appendix-00.md",target:"_blank",rel:"noopener noreferrer"}},[this._v("appendix-00.md"),e("OutboundLink")],1),this._v(" "),e("br"),this._v("\ncommit 4f2dc564851dc04b271a2260c834643dfd86c724")])]),this._v(" "),e("p",[this._v("附录部分包含一些在你的Rust之旅中可能用到的参考资料。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"附录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#附录","aria-hidden":"true"}},[this._v("#")]),this._v(" 附录")])}],!1,null,null,null);n.options.__file="appendix-00.md";e.default=n.exports}}]);
|
1
src/.vuepress/dist/assets/js/50.cadce2ee.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/50.cadce2ee.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/51.d4e57e23.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/51.d4e57e23.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/52.323a010e.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/52.323a010e.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/53.377c0582.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/53.377c0582.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/54.8d06b2c9.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/54.8d06b2c9.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/55.f82d7ef0.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/55.f82d7ef0.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{215:function(t,e,s){"use strict";s.r(e);var i=s(0),r=Object(i.a)({},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("blockquote",[s("p",[s("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch11-00-testing.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch11-00-testing.md"),s("OutboundLink")],1),t._v(" "),s("br"),t._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)中说到 “软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足。”(“Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.”)这并不意味着我们不该尽可能地测试软件!")]),t._v(" "),s("p",[t._v("程序的正确性意味着代码如我们期望的那样运行。Rust 是一个相当注重正确性的编程语言,不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫,不过它不可能捕获所有种类的错误。为此,Rust 也在语言本身包含了编写软件测试的支持。")]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),s("p",[t._v("测试是一项复杂的技能:虽然不能在一个章节的篇幅中介绍如何编写好的测试的每个细节,但我们还是会讨论 Rust 测试功能的机制。我们会讲到编写测试时会用到的注解和宏,运行测试的默认行为和选项,以及如何将测试组织成单元测试和集成测试。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"编写自动化测试"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#编写自动化测试","aria-hidden":"true"}},[this._v("#")]),this._v(" 编写自动化测试")])},function(){var t=this.$createElement,e=this._self._c||t;return e("blockquote",[e("p",[this._v("Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.")]),this._v(" "),e("p",[this._v('Edsger W. Dijkstra, "The Humble Programmer" (1972)')]),this._v(" "),e("p",[this._v("软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足。")]),this._v(" "),e("p",[this._v("Edsger W. Dijkstra,【谦卑的程序员】(1972)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("例如,我们可以编写一个叫做 "),e("code",[this._v("add_two")]),this._v(" 的将传递给它的值加二的函数。它的签名有一个整型参数并返回一个整型值。当实现和编译这个函数时,Rust 会进行所有目前我们已经见过的类型检查和借用检查,例如,这些检查会确保我们不会传递 "),e("code",[this._v("String")]),this._v(" 或无效的引用给这个函数。Rust 所 "),e("strong",[this._v("不能")]),this._v(" 检查的是这个函数是否会准确的完成我们期望的工作:返回参数加二后的值,而不是比如说参数加 10 或减 50 的值!这也就是测试出场的地方。")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("我们可以编写测试断言,比如说,当传递 "),e("code",[this._v("3")]),this._v(" 给 "),e("code",[this._v("add_two")]),this._v(" 函数时,返回值是 "),e("code",[this._v("5")]),this._v("。无论何时对代码进行修改,都可以运行测试来确保任何现存的正确行为没有被改变。")])}],!1,null,null,null);r.options.__file="ch11-00-testing.md";e.default=r.exports}}]);
|
1
src/.vuepress/dist/assets/js/56.c9db2b25.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/56.c9db2b25.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/57.bc11287b.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/57.bc11287b.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/58.a1a44552.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/58.a1a44552.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/59.4afc94b7.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/59.4afc94b7.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{211:function(t,e,r){"use strict";r.r(e);var _=r(0),v=Object(_.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch12-00-an-io-project.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch12-00-an-io-project.md"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),t._v(" "),r("p",[t._v("本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),r("p",[t._v("另外还会简要的讲到闭包、迭代器和 trait 对象,他们分别会在第十三章和第十七章中详细介绍。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"一个-i-o-项目:构建一个命令行程序"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#一个-i-o-项目:构建一个命令行程序","aria-hidden":"true"}},[this._v("#")]),this._v(" 一个 I/O 项目:构建一个命令行程序")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,所以我们的项目将创建一个我们自己版本的经典命令行工具:"),r("code",[t._v("grep")]),t._v("。grep 是 “"),r("strong",[t._v("G")]),t._v("lobally search a "),r("strong",[t._v("R")]),t._v("egular "),r("strong",[t._v("E")]),t._v("xpression and "),r("strong",[t._v("P")]),t._v("rint.” 的首字母缩写。"),r("code",[t._v("grep")]),t._v(" 最简单的使用场景是在特定文件中搜索指定字符串。为此,"),r("code",[t._v("grep")]),t._v(" 获取一个文件名和一个字符串作为参数,接着读取文件并找到其中包含字符串参数的行,然后打印出这些行。")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("在这个过程中,我们会展示如何让我们的命令行工具利用很多命令行工具中用到的终端功能。读取环境变量来使得用户可以配置工具的行为。打印到标准错误控制流("),e("code",[this._v("stderr")]),this._v(") 而不是标准输出("),e("code",[this._v("stdout")]),this._v("),例如这样用户可以选择将成功输出重定向到文件中的同时仍然在屏幕上显示错误信息。")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("一位 Rust 社区的成员,Andrew Gallant,已经创建了一个功能完整且非常快速的 "),r("code",[t._v("grep")]),t._v(" 版本,叫做 "),r("code",[t._v("ripgrep")]),t._v("。相比之下,我们的 "),r("code",[t._v("grep")]),t._v(" 版本将非常简单,本章将教会你一些帮助理解像 "),r("code",[t._v("ripgrep")]),t._v(" 这样真实项目的背景知识。")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("我们的 "),e("code",[this._v("grep")]),this._v(" 项目将会结合之前所学的一些内容:")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ul",[r("li",[t._v("代码组织(使用第七章学习的模块)")]),t._v(" "),r("li",[t._v("vector 和字符串(第八章,集合)")]),t._v(" "),r("li",[t._v("错误处理(第九章)")]),t._v(" "),r("li",[t._v("合理的使用 trait 和生命周期(第十章)")]),t._v(" "),r("li",[t._v("测试(第十一章)")])])}],!1,null,null,null);v.options.__file="ch12-00-an-io-project.md";e.default=v.exports}}]);
|
1
src/.vuepress/dist/assets/js/6.4774d695.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/6.4774d695.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/60.867aed26.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/60.867aed26.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/61.74327fa7.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/61.74327fa7.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/62.177c0b30.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/62.177c0b30.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/63.3e0d51da.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/63.3e0d51da.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/64.e8778b11.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/64.e8778b11.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/65.b0dde85a.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/65.b0dde85a.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/66.3bba1132.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/66.3bba1132.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{204:function(t,e,r){"use strict";r.r(e);var s=r(0),n=Object(s.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/src/ch13-00-functional-features.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch13-00-functional-features.md"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("\ncommit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f")])]),t._v(" "),t._m(1),t._v(" "),r("p",[t._v("本章我们不会讨论函数式编程是或不是什么的问题,而是展示 Rust 的一些在功能上与其他被认为是函数式语言类似的特性。")]),t._v(" "),r("p",[t._v("更具体的,我们将要涉及:")]),t._v(" "),t._m(2),t._v(" "),r("p",[t._v("还有其它受函数式风格影响的 Rust 功能,比如模式匹配和枚举,这些已经在其他章节中讲到过了。掌握闭包和迭代器则是编写符合语言风格的高性能 Rust 代码的重要一环,所以我们将专门用一整章来讲解他们。")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"rust-中的函数式语言功能:迭代器与闭包"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rust-中的函数式语言功能:迭代器与闭包","aria-hidden":"true"}},[this._v("#")]),this._v(" Rust 中的函数式语言功能:迭代器与闭包")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 "),e("strong",[this._v("函数式编程")]),this._v("("),e("em",[this._v("functional programming")]),this._v(")。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ul",[r("li",[r("strong",[t._v("闭包")]),t._v("("),r("em",[t._v("Closures")]),t._v("),一个可以储存在变量里的类似函数的结构")]),t._v(" "),r("li",[r("strong",[t._v("迭代器")]),t._v("("),r("em",[t._v("Iterators")]),t._v("),一种处理元素序列的方式")]),t._v(" "),r("li",[t._v("如何使用这些功能来改进第十二章的 I/O 项目。")]),t._v(" "),r("li",[t._v("这两个功能的性能。("),r("strong",[t._v("剧透警告:")]),t._v(" 他们的速度超乎你的想象!)")])])}],!1,null,null,null);n.options.__file="ch13-00-functional-features.md";e.default=n.exports}}]);
|
1
src/.vuepress/dist/assets/js/67.fb2ec2e1.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/67.fb2ec2e1.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/68.d8ef845b.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/68.d8ef845b.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/69.5b80f65b.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/69.5b80f65b.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/7.010146f6.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/7.010146f6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/70.e265a8a0.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/70.e265a8a0.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/71.08e24461.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/71.08e24461.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{199:function(r,t,e){"use strict";e.r(t);var o=e(0),a=Object(o.a)({},function(){var r=this,t=r.$createElement,e=r._self._c||t;return e("div",{staticClass:"content"},[r._m(0),r._v(" "),e("blockquote",[e("p",[e("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/ch14-00-more-about-cargo.md",target:"_blank",rel:"noopener noreferrer"}},[r._v("ch14-00-more-about-cargo.md"),e("OutboundLink")],1),r._v(" "),e("br"),r._v("\ncommit ff93f82ff63ade5a352d9ccc430945d4ec804cdf")])]),r._v(" "),e("p",[r._v("目前为止我们只使用过 Cargo 构建、运行和测试代码的最基本功能,不过它还可以做到更多。这里我们将了解一些 Cargo 其他更为高级的功能,他们将展示如何:")]),r._v(" "),e("ul",[e("li",[r._v("使用发布配置来自定义构建")]),r._v(" "),e("li",[r._v("将库发布到 "),e("a",{attrs:{href:"https://crates.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("crates.io"),e("OutboundLink")],1)]),r._v(" "),e("li",[r._v("使用工作空间来组织更大的项目")]),r._v(" "),e("li",[r._v("从 "),e("a",{attrs:{href:"https://crates.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("crates.io"),e("OutboundLink")],1),r._v(" 安装二进制文件")]),r._v(" "),e("li",[r._v("使用自定义的命令来扩展 Cargo")])]),r._v(" "),e("p",[r._v("相比本章能够涉及的工作 Cargo 甚至还可以做到更多,关于其功能的全部解释,请查看 "),e("a",{attrs:{href:"http://doc.rust-lang.org/cargo/",target:"_blank",rel:"noopener noreferrer"}},[r._v("其文档"),e("OutboundLink")],1)])])},[function(){var r=this.$createElement,t=this._self._c||r;return t("h1",{attrs:{id:"进一步认识-cargo-和-crates-io"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#进一步认识-cargo-和-crates-io","aria-hidden":"true"}},[this._v("#")]),this._v(" 进一步认识 Cargo 和 Crates.io")])}],!1,null,null,null);a.options.__file="ch14-00-more-about-cargo.md";t.default=a.exports}}]);
|
1
src/.vuepress/dist/assets/js/72.9f1ed203.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/72.9f1ed203.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/73.cf073a90.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/73.cf073a90.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/74.e5e6cb7a.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/74.e5e6cb7a.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/.vuepress/dist/assets/js/75.12d311a9.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/75.12d311a9.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{195:function(t,e,r){"use strict";r.r(e);var i=r(0),s=Object(i.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/ch14-04-installing-binaries.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch14-04-installing-binaries.md"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("\ncommit ff93f82ff63ade5a352d9ccc430945d4ec804cdf")])]),t._v(" "),r("p",[r("code",[t._v("cargo install")]),t._v(" 命令用于在本地安装和使用二进制 crate。它并不打算替换系统中的包;它意在作为一个方便 Rust 开发者们安装其他人已经在 "),r("a",{attrs:{href:"https://crates.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("crates.io"),r("OutboundLink")],1),t._v(" 上共享的工具的手段。只有拥有二进制目标文件的包能够被安装。二进制目标文件是在 crate 有 "),r("em",[t._v("src/main.rs")]),t._v(" 或者其他指定为二进制文件时所创建的可执行程序,这不同于自身不能执行但适合包含在其他程序中的库目标文件。通常 crate 的 "),r("em",[t._v("README")]),t._v(" 文件中有该 crate 是库、二进制目标还是两者都是的信息。")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._m(4)])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"使用-cargo-install-从-crates-io-安装二进制文件"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#使用-cargo-install-从-crates-io-安装二进制文件","aria-hidden":"true"}},[this._v("#")]),this._v(" 使用 "),e("code",[this._v("cargo install")]),this._v(" 从 Crates.io 安装二进制文件")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("所有来自 "),r("code",[t._v("cargo install")]),t._v(" 的二进制文件都安装到 Rust 安装根目录的 "),r("em",[t._v("bin")]),t._v(" 文件夹中。如果你使用 "),r("em",[t._v("rustup.rs")]),t._v(" 安装的 Rust 且没有自定义任何配置,这将是 "),r("code",[t._v("$HOME/.cargo/bin")]),t._v("。确保将这个目录添加到 "),r("code",[t._v("$PATH")]),t._v(" 环境变量中就能够运行通过 "),r("code",[t._v("cargo install")]),t._v(" 安装的程序了。")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("例如,第十二章提到的叫做 "),e("code",[this._v("ripgrep")]),this._v(" 的用于搜索文件的 "),e("code",[this._v("grep")]),this._v(" 的 Rust 实现。如果想要安装 "),e("code",[this._v("ripgrep")]),this._v(",可以运行如下:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-text extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("$ cargo install ripgrep\nUpdating registry `https://github.com/rust-lang/crates.io-index`\n Downloading ripgrep v0.3.2\n --snip--\n Compiling ripgrep v0.3.2\n Finished release [optimized + debuginfo] target(s) in 97.91 secs\n Installing ~/.cargo/bin/rg\n")])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("最后一行输出展示了安装的二进制文件的位置和名称,在这里 "),r("code",[t._v("ripgrep")]),t._v(" 被命名为 "),r("code",[t._v("rg")]),t._v("。只要你像上面提到的那样将安装目录加入 "),r("code",[t._v("$PATH")]),t._v(",就可以运行 "),r("code",[t._v("rg --help")]),t._v(" 并开始使用一个更快更 Rust 的工具来搜索文件了!")])}],!1,null,null,null);s.options.__file="ch14-04-installing-binaries.md";e.default=s.exports}}]);
|
1
src/.vuepress/dist/assets/js/76.27ceea65.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/76.27ceea65.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{194:function(t,e,r){"use strict";r.r(e);var a=r(0),o=Object(a.a)({},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("blockquote",[r("p",[r("a",{attrs:{href:"https://github.com/rust-lang/book/blob/master/second-edition/src/ch14-05-extending-cargo.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("ch14-05-extending-cargo.md"),r("OutboundLink")],1),t._v(" "),r("br"),t._v("\ncommit ff93f82ff63ade5a352d9ccc430945d4ec804cdf")])]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),r("p",[t._v("通过 Cargo 和 "),r("a",{attrs:{href:"https://crates.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("crates.io"),r("OutboundLink")],1),t._v(" 来分享代码是使得 Rust 生态环境可以用于许多不同的任务的重要组成部分。Rust 的标准库是小而稳定的,不过 crate 易于分享和使用,并采用一个不同语言自身的时间线来提供改进。不要羞于在 "),r("a",{attrs:{href:"https://crates.io",target:"_blank",rel:"noopener noreferrer"}},[t._v("crates.io"),r("OutboundLink")],1),t._v(" 上共享对你有用的代码;因为它很有可能对别人也很有用!")])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"cargo-自定义扩展命令"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cargo-自定义扩展命令","aria-hidden":"true"}},[this._v("#")]),this._v(" Cargo 自定义扩展命令")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("p",[t._v("Cargo 被设计为可以通过新的子命令而无须修改 Cargo 自身来进行扩展。如果 "),r("code",[t._v("$PATH")]),t._v(" 中有类似 "),r("code",[t._v("cargo-something")]),t._v(" 的二进制文件,就可以通过 "),r("code",[t._v("cargo something")]),t._v(" 来像 Cargo 子命令一样运行它。像这样的自定义命令也可以运行 "),r("code",[t._v("cargo --list")]),t._v(" 来展示出来。能够通过 "),r("code",[t._v("cargo install")]),t._v(" 向 Cargo 安装扩展并可以如内建 Cargo 工具那样运行他们是 Cargo 设计上的一个非常方便的优点!")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"总结"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#总结","aria-hidden":"true"}},[this._v("#")]),this._v(" 总结")])}],!1,null,null,null);o.options.__file="ch14-05-extending-cargo.md";e.default=o.exports}}]);
|
1
src/.vuepress/dist/assets/js/77.2d04e2fc.js
vendored
Normal file
1
src/.vuepress/dist/assets/js/77.2d04e2fc.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user