本手册适用于新的 Rust 程序员,因此他们可以快速了解 Rust crate(箱子) 生态系统的能力。它也适用于经验丰富的 Rust 程序员,他们应该在食谱中,找到如何完成常见任务的简单提示。
烹饪书的索引页包含完整的食谱列表,分为几个部分:“基础”,“编码”,“并发”等。这些部分本身或多或少地按顺序排列,后面的部分,更先进,偶尔是在前面部分的概念之上构建。
在索引中,每个部分都包含一个食谱列表。食谱是要完成任务的简单陈述,例如“生成范围内的随机数”;并且每个食谱都标有徽章,表明哪个箱子是他们所使用的,像[![rand-badge]][rand],以及那些箱子在crates.io上,属于哪些类别。像[![cat-science-badge]][cat-science]。
新的 Rust 程序员,应该从第一部分开始,按顺序到最后一部分,这样阅读起来会很舒服,这样做可以让人们对 crate 生态系统,有一个很好的大菊观。单击,索引中的章节标题,或单击,侧栏以导航到某章节页面。
如果,您只是在寻找简单任务的解决方案,那么今时今日的烹饪书,还较难导航。查找特定食谱的最简单方法是扫描索引,查找感兴趣的箱子和类别。从那里,单击食谱名称进行查看。这导航方面在未来会改善的。
食谱旨在让您即时访问到,能工作的代码,并全面解释其正在执行的操作,并指导您获取更多信息。
烹饪书中的所有食谱都是完整的,自包含(自给自足)的程序,因此可以将它们直接复制到,您自己的项目中进行实验。为此,请按照以下说明,进行操作。
考虑这个例子:“生成一个范围内的随机数”:
[![rand-badge]][rand] [![cat-science-badge]][cat-science]
extern crate rand;
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
println!("Random f64: {}", rng.gen::<f64>());
}
要在本地使用它,我们可以运行以下命令,来创建一个新的货物(cargo)项目,并切换到该目录:
cargo new my-example --bin
cd my-example
现在,我们还需要添加必要的箱子到Cargo.toml,如箱子徽章所示,在这种情况下只是“rand”。为此,我们将使用cargo add
命令,这是由cargo-edit
箱子提供的(自定义)命令,我们需要先安装:
cargo install cargo-edit
cargo add rand
现在,你可以把src/main.rs
,替换成,用例中的完整内容并运行:
cargo run
示例附带的箱子徽章,链接到箱子的完整docs.rs文档(一个专放Rust项目文档的官方托管网站),并且通常,在你决定哪个箱子套件后,您应该阅读相关文档。
如果做得正确,Rust 中的错误处理是健壮的,但对今时今日的 Rust 来说,就需要相当多的模版。正是这个原因,你经常看到 Rust 的例子,充满了unwrap
调用,而不是正确的错误处理。
由于这些食谱,具有原样复用的目标,并鼓励最佳实践,因此当涉及Result
类型,它们就会正确设置错误处理。
我们使用的基本模式是,具备一个fn run() -> Result
,让它像“真正的”main 函数行动。我们用的是error-chain箱子,使?
在run
里面工作。
错误处理的结构,通常如下:
#[macro_use]
extern crate error_chain;
use std::net::IpAddr;
use std::str;
error_chain! {
foreign_links {
Utf8(std::str::Utf8Error);
AddrParse(std::net::AddrParseError);
}
}
fn run() -> Result<()> {
let bytes = b"2001:db8::1";
// Bytes 到 string.
let s = str::from_utf8(bytes)?;
// String 到 IP address.
let addr: IpAddr = s.parse()?;
println!("{:?}", addr);
Ok(())
}
quick_main!(run);
这是使用error_chain!
宏,自定义一个Error
和Result
类型,以及来自两个标准库的错误类型的自动转换。自动转换使?
操作符工作。该quick_main!
宏生成,实际main
,并在发生错误时,打印出错误。
为了便于阅读,错误处理模版,默认隐藏,如下所示。要阅读完整内容,请单击“展开”()按钮,它位于代码段的右上角。
# #[macro_use]
# extern crate error_chain;
extern crate url;
use url::{Url, Position};
#
# error_chain! {
# foreign_links {
# UrlParse(url::ParseError);
# }
# }
fn run() -> Result<()> {
let parsed = Url::parse("https://httpbin.org/cookies/set?k2=v2&k1=v1")?;
let cleaned: &str = &parsed[..Position::AfterPath];
println!("cleaned: {}", cleaned);
Ok(())
}
#
# quick_main!(run);
有关 Rust 中错误处理的更多背景知识,请阅读这本 Rust 书和这篇博文。
这本烹饪书,最终的目标,是提供对 Rust crate 生态系统的广泛认知,但是,今天我们在它的引导下,进行演示时,范围还很有限。希望从小范围开始,缓慢扩展(认知),将有助于烹饪书,更快地成为高质量的资源,常话说:不要急,最重要快!并在增长时,保持一致的质量水平。
目前,烹饪书专注于标准库,以及“核心”或“基础”,箱子 - 都是构成最常见的编程任务的那些箱子,其余的,就是生态系统的部分构建。
这本烹饪书与Rust Libz Blitz密切相关,一个识别和提高此类箱子质量的项目,因此该项目在很大程度上,延迟箱子入选的问题。该过程的一部分,作为已经评估的任何箱子,都在烹饪书的(书写)范围内,而正在等待评估的箱子也是如此。
{{#include links.zh.md}}