[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fpackage":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fpackage":916,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fpackage":942},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":912,"stem":913,"id":914,"extension":915},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fpackage","第七章：模块系统与包管理","Rust 的模块系统为代码组织、封装和复用提供了一套严谨但灵活的机制。包、crate、模块以及 use 路径相互配合，让你能够把项目拆解成清晰的功能单元，同时精确控制哪些对外可见。本章将带你系统掌握这些构建大型 Rust 项目所必需的…","技能小册",[12,13],"rust","package","2024-05-26",false,{"type":17,"value":18,"toc":878},"minimark",[19,23,32,37,48,52,59,80,86,101,104,114,126,142,158,161,165,172,175,178,211,226,241,252,260,277,280,291,340,344,351,377,392,402,411,417,423,428,443,455,470,473,481,488,496,516,519,545,549,555,562,567,576,583,588,595,606,609,615,644,659,665,671,675,678,687,697,700,707,722,725,728,737,740,755,770,774,780,789,792,795,807,813,816,874],[20,21,8],"h1",{"id":22},"第七章模块系统与包管理",[24,25,26,27,31],"p",{},"Rust 的模块系统为代码组织、封装和复用提供了一套严谨但灵活的机制。包、crate、模块以及 ",[28,29,30],"code",{},"use"," 路径相互配合，让你能够把项目拆解成清晰的功能单元，同时精确控制哪些对外可见。本章将带你系统掌握这些构建大型 Rust 项目所必需的组织工具。",[33,34,36],"h2",{"id":35},"_71-包package与-crate","7.1 包（Package）与 Crate",[24,38,39,40,44,45,47],{},"在 Rust 中，代码的基本编译单元是 ",[41,42,43],"strong",{},"crate","，而发布和版本管理的单元是 ",[41,46,13],{},"。",[49,50,51],"h3",{"id":43},"Crate",[24,53,54,55,58],{},"一个 crate 是一个独立的编译单元。编译器一次处理一个 crate，生成库或可执行文件。每个 crate 都有一个 ",[41,56,57],{},"crate root","，即编译的入口源文件：",[60,61,62,69],"ul",{},[63,64,65,66],"li",{},"库 crate 的根为 ",[28,67,68],{},"src\u002Flib.rs",[63,70,71,72,75,76,79],{},"二进制 crate 的根为 ",[28,73,74],{},"src\u002Fmain.rs","（也可以有其它二进制入口，例如 ",[28,77,78],{},"src\u002Fbin\u002Ffoo.rs","，每个对应一个二进制 crate）",[24,81,82,83,85],{},"在代码中，",[28,84,43],{}," 关键字代表当前 crate 的根模块，用于构建绝对路径：",[87,88,92],"pre",{"className":89,"code":90,"language":12,"meta":91,"style":91},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","crate::some_module::some_function();\n","",[28,93,94],{"__ignoreMap":91},[95,96,99],"span",{"class":97,"line":98},"line",1,[95,100,90],{},[49,102,103],{"id":13},"Package",[24,105,106,107,109,110,113],{},"一个 ",[41,108,13],{},"（包）由一个 ",[28,111,112],{},"Cargo.toml"," 文件描述，它可以包含：",[60,115,116,121],{},[63,117,118],{},[41,119,120],{},"0 或 1 个库 crate",[63,122,123],{},[41,124,125],{},"任意数量的二进制 crate",[24,127,128,129,132,133,135,136,138,139,141],{},"典型的新项目 ",[28,130,131],{},"cargo new my_app"," 生成的是一个包含单一二进制 crate 的包（",[28,134,74],{},"）。如果同时需要库和二进制，可以在 ",[28,137,68],{}," 和 ",[28,140,74],{}," 中分别编写，二进制部分通过 crate 名引用库：",[87,143,145],{"className":89,"code":144,"language":12,"meta":91,"style":91},"\u002F\u002F src\u002Fmain.rs\nuse my_app::some_function;\n",[28,146,147,152],{"__ignoreMap":91},[95,148,149],{"class":97,"line":98},[95,150,151],{},"\u002F\u002F src\u002Fmain.rs\n",[95,153,155],{"class":97,"line":154},2,[95,156,157],{},"use my_app::some_function;\n",[24,159,160],{},"很多项目将核心逻辑放在库 crate 中，二进制 crate 只保留轻量的入口点，这样便于测试和复用。",[33,162,164],{"id":163},"_72-模块mod","7.2 模块（mod）",[24,166,167,168,171],{},"模块用来在一个 crate 内部将代码组织成命名空间，控制条目的",[41,169,170],{},"私有性","。你可以把模块理解为代码的目录结构。",[49,173,174],{"id":174},"定义模块",[24,176,177],{},"模块可以用内联方式定义：",[87,179,181],{"className":89,"code":180,"language":12,"meta":91,"style":91},"mod sound {\n    pub fn play() {\n        println!(\"Playing sound\");\n    }\n}\n",[28,182,183,188,193,199,205],{"__ignoreMap":91},[95,184,185],{"class":97,"line":98},[95,186,187],{},"mod sound {\n",[95,189,190],{"class":97,"line":154},[95,191,192],{},"    pub fn play() {\n",[95,194,196],{"class":97,"line":195},3,[95,197,198],{},"        println!(\"Playing sound\");\n",[95,200,202],{"class":97,"line":201},4,[95,203,204],{},"    }\n",[95,206,208],{"class":97,"line":207},5,[95,209,210],{},"}\n",[24,212,213,214,217,218,221,222,225],{},"或者用文件系统映射。在 ",[28,215,216],{},"main.rs"," \u002F ",[28,219,220],{},"lib.rs"," 中写下 ",[28,223,224],{},"mod my_module;"," 时，编译器会去寻找：",[60,227,228,234],{},[63,229,230,233],{},[28,231,232],{},"my_module.rs","（在同一目录下）",[63,235,236,237,240],{},"或 ",[28,238,239],{},"my_module\u002Fmod.rs","（旧风格，但仍可用）",[24,242,243,244,247,248,251],{},"2018 edition 后，通常推荐直接创建一个与模块同名的 ",[28,245,246],{},".rs"," 文件，避免 ",[28,249,250],{},"mod.rs"," 造成的文件堆积。例如：",[87,253,258],{"className":254,"code":256,"language":257},[255],"language-text","src\u002F\n├── main.rs\n└── sound.rs\n","text",[28,259,256],{"__ignoreMap":91},[24,261,262,264,265,268,269,272,273,276],{},[28,263,216],{}," 中声明 ",[28,266,267],{},"mod sound;","，",[28,270,271],{},"sound.rs"," 内即为 ",[28,274,275],{},"sound"," 模块的内容。模块也可以嵌套，只需相应地创建子目录和文件。",[49,278,279],{"id":279},"模块可见性",[24,281,282,283,286,287,290],{},"所有模块、函数、结构体等条目默认为",[41,284,285],{},"私有","，只对当前模块及其子模块可见。使用 ",[28,288,289],{},"pub"," 关键字将其公开：",[87,292,294],{"className":89,"code":293,"language":12,"meta":91,"style":91},"mod plant {\n    pub struct Vegetable { .. }\n    fn private_function() { .. }\n}\nfn main() {\n    let v = plant::Vegetable { .. }; \u002F\u002F 允许，Vegetable 为 pub\n    \u002F\u002F plant::private_function();    \u002F\u002F 错误，私有\n}\n",[28,295,296,301,306,311,315,320,326,335],{"__ignoreMap":91},[95,297,298],{"class":97,"line":98},[95,299,300],{},"mod plant {\n",[95,302,303],{"class":97,"line":154},[95,304,305],{},"    pub struct Vegetable { .. }\n",[95,307,308],{"class":97,"line":195},[95,309,310],{},"    fn private_function() { .. }\n",[95,312,313],{"class":97,"line":201},[95,314,210],{},[95,316,317],{"class":97,"line":207},[95,318,319],{},"fn main() {\n",[95,321,323],{"class":97,"line":322},6,[95,324,325],{},"    let v = plant::Vegetable { .. }; \u002F\u002F 允许，Vegetable 为 pub\n",[95,327,329,332],{"class":97,"line":328},7,[95,330,331],{},"    \u002F\u002F plant::private_function();",[95,333,334],{},"    \u002F\u002F 错误，私有\n",[95,336,338],{"class":97,"line":337},8,[95,339,210],{},[49,341,343],{"id":342},"路径绝对路径与相对路径","路径：绝对路径与相对路径",[24,345,346,347,350],{},"访问模块内条目使用 ",[28,348,349],{},"::"," 分隔符。路径可以是：",[60,352,353,363],{},[63,354,355,358,359,362],{},[41,356,357],{},"绝对路径","：从 crate 根开始，使用 ",[28,360,361],{},"crate::"," 或字面 crate 名（外部 crate 用其名）",[63,364,365,368,369,372,373,376],{},[41,366,367],{},"相对路径","：从当前模块开始，使用 ",[28,370,371],{},"self::","、",[28,374,375],{},"super::"," 或直接标识符",[87,378,380],{"className":89,"code":379,"language":12,"meta":91,"style":91},"crate::front_of_house::hosting::add_to_waitlist(); \u002F\u002F 绝对路径\nfront_of_house::hosting::add_to_waitlist();        \u002F\u002F 相对路径\n",[28,381,382,387],{"__ignoreMap":91},[95,383,384],{"class":97,"line":98},[95,385,386],{},"crate::front_of_house::hosting::add_to_waitlist(); \u002F\u002F 绝对路径\n",[95,388,389],{"class":97,"line":154},[95,390,391],{},"front_of_house::hosting::add_to_waitlist();        \u002F\u002F 相对路径\n",[24,393,394,397,398,401],{},[28,395,396],{},"super"," 指向上级模块，类似于文件系统中的 ",[28,399,400],{},"..","：",[87,403,405],{"className":89,"code":404,"language":12,"meta":91,"style":91},"super::some_function();\n",[28,406,407],{"__ignoreMap":91},[95,408,409],{"class":97,"line":98},[95,410,404],{},[24,412,413,416],{},[28,414,415],{},"self"," 表示当前模块，通常用于消除歧义或明确引入。",[49,418,420,422],{"id":419},"use-导入",[28,421,30],{}," 导入",[24,424,425,427],{},[28,426,30],{}," 语句将路径引入当前作用域，减少重复书写长路径：",[87,429,431],{"className":89,"code":430,"language":12,"meta":91,"style":91},"use std::collections::HashMap;\nlet mut map = HashMap::new();\n",[28,432,433,438],{"__ignoreMap":91},[95,434,435],{"class":97,"line":98},[95,436,437],{},"use std::collections::HashMap;\n",[95,439,440],{"class":97,"line":154},[95,441,442],{},"let mut map = HashMap::new();\n",[24,444,445,446,448,449,451,452,454],{},"在模块内部使用 ",[28,447,30],{}," 时，路径默认是绝对路径（从 crate 根开始），除非用 ",[28,450,415],{}," 或 ",[28,453,396],{}," 指定相对。习惯上，函数通过保留父路径来区分来源：",[87,456,458],{"className":89,"code":457,"language":12,"meta":91,"style":91},"use crate::front_of_house::hosting;\nhosting::add_to_waitlist(); \u002F\u002F 清楚显示函数来自 hosting\n",[28,459,460,465],{"__ignoreMap":91},[95,461,462],{"class":97,"line":98},[95,463,464],{},"use crate::front_of_house::hosting;\n",[95,466,467],{"class":97,"line":154},[95,468,469],{},"hosting::add_to_waitlist(); \u002F\u002F 清楚显示函数来自 hosting\n",[24,471,472],{},"对于结构体、枚举等，则通常直接引入完整名称：",[87,474,475],{"className":89,"code":437,"language":12,"meta":91,"style":91},[28,476,477],{"__ignoreMap":91},[95,478,479],{"class":97,"line":98},[95,480,437],{},[49,482,484,487],{"id":483},"pub-use-重导出",[28,485,486],{},"pub use"," 重导出",[24,489,490,492,493,495],{},[28,491,486],{}," 可以让一个条目在当前模块公开的同时，从另一个路径导入，从而对外暴露一个不同的 API 结构。这在构建友好的公共接口时非常有用：你可以把内部细节组织得很深，但通过 ",[28,494,486],{}," 将核心类型重新放置到顶层模块中。",[87,497,499],{"className":89,"code":498,"language":12,"meta":91,"style":91},"\u002F\u002F lib.rs\nmod engine;\npub use engine::Core; \u002F\u002F Core 现在可以直接通过 crate::Core 访问\n",[28,500,501,506,511],{"__ignoreMap":91},[95,502,503],{"class":97,"line":98},[95,504,505],{},"\u002F\u002F lib.rs\n",[95,507,508],{"class":97,"line":154},[95,509,510],{},"mod engine;\n",[95,512,513],{"class":97,"line":195},[95,514,515],{},"pub use engine::Core; \u002F\u002F Core 现在可以直接通过 crate::Core 访问\n",[49,517,518],{"id":518},"模块拆分建议",[60,520,521,527,536],{},[63,522,523,526],{},[41,524,525],{},"功能相关","：将紧密协作的类型和函数放在同一模块。",[63,528,529,532,533,535],{},[41,530,531],{},"扁平优先","：不要过深嵌套，通常两到三层模块已足够。过深的层级会增加 ",[28,534,30],{}," 噪音。",[63,537,538,541,542,544],{},[41,539,540],{},"合理暴露","：谨慎使用 ",[28,543,289],{},"，隐藏实现细节有助于未来修改。",[33,546,548],{"id":547},"_73-可见性细节","7.3 可见性细节",[24,550,551,552,554],{},"除了简单的 ",[28,553,289],{}," \u002F 私有之外，Rust 还支持细粒度的可见性修饰，精确控制条目对哪些范围开放。",[49,556,558,561],{"id":557},"pubcrate-crate-内公开",[28,559,560],{},"pub(crate)"," — crate 内公开",[24,563,564,566],{},[28,565,560],{}," 使条目在当前 crate 内部公开，但对下游的 crate 使用者不可见。它常用于内部模块借用，而不想暴露为公共 API。",[87,568,570],{"className":89,"code":569,"language":12,"meta":91,"style":91},"pub(crate) fn internal_helper() { .. }\n",[28,571,572],{"__ignoreMap":91},[95,573,574],{"class":97,"line":98},[95,575,569],{},[49,577,579,582],{"id":578},"pubsuper-父模块内公开",[28,580,581],{},"pub(super)"," — 父模块内公开",[24,584,585,587],{},[28,586,581],{}," 让条目对父模块（上一级）可见，但对外部模块隐藏。这有助于在父模块内部分享一些子模块的细节。",[49,589,591,594],{"id":590},"pubin-path-指定路径内公开",[28,592,593],{},"pub(in path)"," — 指定路径内公开",[24,596,597,598,601,602,605],{},"可以传入一个具体路径，表示条目只对该路径内的代码可见。例如 ",[28,599,600],{},"pub(in crate::some_module)"," 使条目仅对 ",[28,603,604],{},"some_module"," 及其后代可见。",[49,607,608],{"id":608},"结构体字段的可见性",[24,610,611,612,614],{},"结构体本身可以是 ",[28,613,289],{},"，但它的字段可以各自拥有不同的可见性，从而构建出精细封装的 API：",[87,616,618],{"className":89,"code":617,"language":12,"meta":91,"style":91},"pub struct User {\n    pub username: String,      \u002F\u002F 完全公开\n    pub(crate) token: String,  \u002F\u002F crate 内可见\n    password_hash: String,     \u002F\u002F 私有\n}\n",[28,619,620,625,630,635,640],{"__ignoreMap":91},[95,621,622],{"class":97,"line":98},[95,623,624],{},"pub struct User {\n",[95,626,627],{"class":97,"line":154},[95,628,629],{},"    pub username: String,      \u002F\u002F 完全公开\n",[95,631,632],{"class":97,"line":195},[95,633,634],{},"    pub(crate) token: String,  \u002F\u002F crate 内可见\n",[95,636,637],{"class":97,"line":201},[95,638,639],{},"    password_hash: String,     \u002F\u002F 私有\n",[95,641,642],{"class":97,"line":207},[95,643,210],{},[24,645,646,647,650,651,654,655,658],{},"这样，外部代码只能访问 ",[28,648,649],{},"username","，而 ",[28,652,653],{},"token"," 只能在 crate 内部使用，",[28,656,657],{},"password_hash"," 则完全隐藏。",[33,660,662,663],{"id":661},"_74-外部依赖与-use","7.4 外部依赖与 ",[28,664,30],{},[24,666,667,668,670],{},"在 ",[28,669,112],{}," 中添加依赖后，便可以在代码中通过 crate 名引用其内容。",[49,672,674],{"id":673},"用-crate-名引入","用 crate 名引入",[24,676,677],{},"外部 crate 的根模块用其名称访问，这与本地模块的绝对路径类似：",[87,679,681],{"className":89,"code":680,"language":12,"meta":91,"style":91},"use serde::Deserialize;\n",[28,682,683],{"__ignoreMap":91},[95,684,685],{"class":97,"line":98},[95,686,680],{},[24,688,689,690,693,694,47],{},"当外部 crate 名称含有连字符时，Rust 会自动将其转换为下划线，例如 ",[28,691,692],{},"my-crate"," 在代码中写为 ",[28,695,696],{},"my_crate",[49,698,699],{"id":699},"重命名",[24,701,702,703,706],{},"使用 ",[28,704,705],{},"as"," 为导入的条目起别名，解决命名冲突或提升可读性：",[87,708,710],{"className":89,"code":709,"language":12,"meta":91,"style":91},"use std::io::Result as IoResult;\nfn read() -> IoResult\u003C()> { .. }\n",[28,711,712,717],{"__ignoreMap":91},[95,713,714],{"class":97,"line":98},[95,715,716],{},"use std::io::Result as IoResult;\n",[95,718,719],{"class":97,"line":154},[95,720,721],{},"fn read() -> IoResult\u003C()> { .. }\n",[49,723,724],{"id":724},"引入多个条目",[24,726,727],{},"利用花括号合并同一前缀的导入：",[87,729,731],{"className":89,"code":730,"language":12,"meta":91,"style":91},"use std::{cmp::Ordering, io};\n",[28,732,733],{"__ignoreMap":91},[95,734,735],{"class":97,"line":98},[95,736,730],{},[24,738,739],{},"等价于：",[87,741,743],{"className":89,"code":742,"language":12,"meta":91,"style":91},"use std::cmp::Ordering;\nuse std::io;\n",[28,744,745,750],{"__ignoreMap":91},[95,746,747],{"class":97,"line":98},[95,748,749],{},"use std::cmp::Ordering;\n",[95,751,752],{"class":97,"line":154},[95,753,754],{},"use std::io;\n",[24,756,757,758,761,762,765,766,769],{},"还可以嵌套，例如 ",[28,759,760],{},"use std::io::{self, Read};"," 同时导入 ",[28,763,764],{},"io"," 模块本身和 ",[28,767,768],{},"Read"," trait。",[49,771,773],{"id":772},"glob-导入","glob 导入",[24,775,702,776,779],{},[28,777,778],{},"*"," 一次性引入某个模块中所有公开条目：",[87,781,783],{"className":89,"code":782,"language":12,"meta":91,"style":91},"use std::collections::*;\n",[28,784,785],{"__ignoreMap":91},[95,786,787],{"class":97,"line":98},[95,788,782],{},[24,790,791],{},"虽然方便，但容易污染命名空间，降低可读性，且可能引入意想不到的名字冲突。通常只推荐在测试模块或预导入模块（prelude）中使用。",[49,793,794],{"id":794},"管理外部依赖的结构",[24,796,797,798,800,801,803,804,806],{},"合理组织 ",[28,799,30],{}," 语句是保持代码整洁的关键。常见的风格是将 ",[28,802,30],{}," 分为若干组，并用空行分隔：标准库导入、外部 crate 导入、本地模块导入（",[28,805,361],{},"）。还可以按深度排序，使得文件头部一目了然。",[24,808,809,810,812],{},"通过包与 crate 界定编译单元，通过模块组织命名空间，再配合精确的可见性与 ",[28,811,30],{}," 导入，Rust 的模块系统在保障封装性的同时提供了极高的灵活性。掌握了这些规则，你就能轻松驾驭从单文件脚本到大型工作空间的任何项目结构。",[33,814,815],{"id":815},"参考文献",[817,818,819,832],"table",{},[820,821,822],"thead",{},[823,824,825,829],"tr",{},[826,827,828],"th",{},"资料",[826,830,831],{},"说明",[833,834,835,850,862],"tbody",{},[823,836,837,847],{},[838,839,840],"td",{},[841,842,846],"a",{"href":843,"rel":844},"https:\u002F\u002Fdoc.rust-lang.org\u002Fbook\u002Fch07-00-managing-growing-projects.html",[845],"nofollow","Packages and crates",[838,848,849],{},"官方书第 7 章",[823,851,852,859],{},[838,853,854],{},[841,855,858],{"href":856,"rel":857},"https:\u002F\u002Fdoc.rust-lang.org\u002Fbook\u002Fch14-03-cargo-workspaces.html",[845],"Cargo workspaces",[838,860,861],{},"工作空间",[823,863,864,871],{},[838,865,866],{},[841,867,870],{"href":868,"rel":869},"https:\u002F\u002Fdoc.rust-lang.org\u002Fcargo\u002F",[845],"Cargo 手册",[838,872,873],{},"包管理",[875,876,877],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":91,"searchDepth":154,"depth":154,"links":879},[880,884,894,903,911],{"id":35,"depth":154,"text":36,"children":881},[882,883],{"id":43,"depth":195,"text":51},{"id":13,"depth":195,"text":103},{"id":163,"depth":154,"text":164,"children":885},[886,887,888,889,891,893],{"id":174,"depth":195,"text":174},{"id":279,"depth":195,"text":279},{"id":342,"depth":195,"text":343},{"id":419,"depth":195,"text":890},"use 导入",{"id":483,"depth":195,"text":892},"pub use 重导出",{"id":518,"depth":195,"text":518},{"id":547,"depth":154,"text":548,"children":895},[896,898,900,902],{"id":557,"depth":195,"text":897},"pub(crate) — crate 内公开",{"id":578,"depth":195,"text":899},"pub(super) — 父模块内公开",{"id":590,"depth":195,"text":901},"pub(in path) — 指定路径内公开",{"id":608,"depth":195,"text":608},{"id":661,"depth":154,"text":904,"children":905},"7.4 外部依赖与 use",[906,907,908,909,910],{"id":673,"depth":195,"text":674},{"id":699,"depth":195,"text":699},{"id":724,"depth":195,"text":724},{"id":772,"depth":195,"text":773},{"id":794,"depth":195,"text":794},{"id":815,"depth":154,"text":815},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FRust\u002Fpackage","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FRust\u002Fpackage.md","md",{"items":917},[918,922,926,930,934,938],{"path":919,"title":920,"description":921,"category":10,"score":322},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fdocs","第八章：测试、文档与质量","Rust 将测试和文档视为语言的一等公民。通过内置的测试框架，你可以在项目里编写单元测试、集成测试以及随文档一起运行的示例测试，三者共用 cargo test 命令。配合 cargo doc 生成文档，形成了一套确保代码质量与可维护性…",{"path":923,"title":924,"description":925,"category":10,"score":322},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Ft","泛型与 Trait","泛型和 trait 是 Rust 实现代码复用与多态的两大支柱。前置：Rust 基础。泛型让代码可以工作在多种类型上而不牺牲性能，trait 定义了类型间的共享行为，二者结合形成了零成本抽象的强大表达能力。本章将深入泛型定义、trai…",{"path":927,"title":928,"description":929,"category":10,"score":322},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Ftype","第二章：基础语法与类型","Rust 的类型系统和语法设计处处体现着“安全”与“显式”的理念。这一章你将掌握变量绑定、基本类型、复合类型、函数定义以及所有基础控制流结构，它们是你写出任何 Rust 程序的基石。",{"path":931,"title":932,"description":933,"category":10,"score":322},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fother","第十章：进阶特性与模式","Rust 的核心安全保证覆盖了绝大多数日常编程场景。但当你需要打破常规——无论是编写极致通用的抽象、与 C 库交互，还是内联优化——本章将带你进入 Rust 的深层能力：声明宏与过程宏、unsafe 的超能力与封装、高级类型系统技巧…",{"path":935,"title":936,"description":937,"category":10,"score":322},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Ferror","第五章：错误处理","Rust 将错误明确分为两类：不可恢复的错误与可恢复的错误。通过 panic! 处理前一种，Result 处理后一种，这让程序的错误路径不再是隐式的控制流，而是强类型、必须处理的代码分支。配合 Option 对缺失值的处理以及丰富的组…",{"path":939,"title":940,"description":941,"category":10,"score":322},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fcore","第三章：所有权、借用与生命周期（核心）","所有权系统是 Rust 最独特、最核心的语言特性。它让 Rust 无需垃圾回收器就能保证内存安全，并在编译期消除数据竞争。本章你将深入理解所有权如何运转、引用和借用如何被检查、生命周期如何标注，以及常见智能指针如何扩展所有权模型。",{"series":943,"title":12,"items":944,"index":328,"prev":970,"next":971},"booklet\u002Fend\u002Frust",[945,949,953,955,959,961,963,965,966,968],{"path":946,"title":947,"date":948,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fasync","第九章：并发与异步","2020-05-22",{"path":950,"title":951,"date":952,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fbase","Rust 基础","2020-07-21",{"path":939,"title":940,"date":954,"pinned":15},"2023-05-09",{"path":956,"title":957,"date":958,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Frust\u002Fdata-type","第四章：复合数据类型","2021-02-24",{"path":919,"title":920,"date":960,"pinned":15},"2026-01-11",{"path":935,"title":936,"date":962,"pinned":15},"2023-11-03",{"path":931,"title":932,"date":964,"pinned":15},"2023-12-29",{"path":7,"title":8,"date":14,"pinned":15},{"path":923,"title":924,"date":967,"pinned":15},"2024-10-31",{"path":927,"title":928,"date":969,"pinned":15},"2024-08-31",{"path":931,"title":932,"date":964,"pinned":15},{"path":923,"title":924,"date":967,"pinned":15}]