Rust
- 标签:Rust、基础、
- 时间:2020年8月6日6:25:00
- 连接:http://www.saveload.cn/html/templates/Thinking-In-Java.mk
Rust 中有三和重要的组织概念:包、箱、模块。
- Packages: A Cargo feature that lets you build, test, and share crates 包装:货运功能,可让您构建,测试和共享包装箱
- Crates: A tree of modules that produces a library or executable 板条箱:产生库或可执行文件的模块树
- Modules and use: Let you control the organization, scope, and privacy of paths 模块和用途:让您控制路径的组织,范围和隐私
- Paths: A way of naming an item, such as a struct, function, or module 路径:一种命名项目的方法,例如结构,函数或模块
Cargo 是 Rust 的构建系统和包管理器。它可以帮助开发人员下载和管理依赖项,并帮助创建 Rust 包。在 Rust 社区中,Rust 中的“包”通常被称为“crate”(板条箱),因此在安装 Rust 时会得到 Cargo。
要创建一个新的包,请使用关键字 new,跟上包名称。
cargo new my-project
当运行 cargo new 时是在创建一个包
运行 tree 命令以查看目录结构,它会报告已创建了一些文件和目录,首先,它创建一个带有包名称的目录,并且在该目录内有一个存放你的源代码文件的 src 目录,src 目录下会生成一个 main.rs 源文件,Cargo 默认这个文件为二进制箱的根,编译之后的二进制箱将与包名相同:
$ tree .
.
└── hello_opensource
├── Cargo.toml
└── src
└── main.rs
2 directories, 2 files
main.rs 文件经过编译后生产问二进制可执行文件与包名相同
一个软件包包含一个Cargo.toml文件,包必须由一个 Cargo.toml 文件来管理,该文件描述了包的基本信息以及依赖项。
一个包最多包含一个库"箱",可以包含任意数量的二进制"箱",但是至少包含一个"箱"(不管是库还是二进制"箱")。
Cargo 的约定是如果在代表表的 Cargo.toml 的同级目录下包含 src 目录且其中包含 main.rs 文件的话,Cargo 就知道这个包带有一个与包同名的二进制 crate,且 src/main.rs 就是 crate 根。另一个约定如果包目录中包含 src/lib.rs,则包带有与其同名的库 crate,且 src/lib.rs 是 crate 根。crate 根文件将由 Cargo 传递给 rustc来实际构建库或者二进制项目。
我们有一个仅包含src / main.rs的软件包,这意味着它仅包含一个名为的二进制条板箱my-project。如果软件包包含src / main.rs 和src / lib.rs,则它有两个包装箱:库和二进制文件,两者的名称与软件包相同。通过将文件放在src / bin目录中,一个软件包可以具有多个二进制文件箱:每个文件将是一个单独的二进制文件箱。
这是因为 main.rs 和 lib.rs 对于一个 crate 来讲,是两个特殊的文件名。rustc 内置了对这两个特殊文件名的处理(当然也可以通过 Cargo.toml 进行配置,不详谈),我们可以认为它们就是一个 crate 的入口。
可执行 crate 和库 crate 是两种不同的 crate。
板条箱会将范围内的相关功能组合在一起,因此该功能易于在多个项目之间共享。例如,rand我们在第2章中使用的 板条箱提供了生成随机数的功能。通过将rand板条箱放入我们项目的范围,我们可以在自己的项目中使用该功能。rand板条箱提供的所有功能都可以通过板条箱的名称进行访问rand。
Keeping a crate’s functionality in its own scope clarifies whether particular functionality is defined in our crate or the rand crate and prevents potential conflicts. For example, the rand crate provides a trait named Rng. We can also define a struct named Rng in our own crate. Because a crate’s functionality is namespaced in its own scope, when we add rand as a dependency, the compiler isn’t confused about what the name Rng refers to. In our crate, it refers to the struct Rng that we defined. We would access the Rng trait from the rand crate as rand::Rng. 将板条箱的功能保持在其自己的范围内可以澄清是在我们的板条箱中还是在rand板条箱中定义了特定功能,并防止了潜在的冲突。例如,rand 板条箱提供了一个名为的特征 Rng。我们还可以在自己的板条箱中定义一个 struct named Rng。由于包装箱的功能是在其自己的作用域中命名的,因此当我们添加rand为依赖项时,编译器不会对名称Rng所指的内容感到困惑。在我们的箱子中,它指的 struct Rng是我们定义的。我们可以Rng从rand板条箱访问 特质rand::Rng。
上面提到了 trait 和 struct ,struct 是 5.1 里面说的 结构。trait: 一个Trait描述了一种抽象接口(找不到很合适的词),这个抽象接口可以被类型继承。Trait只能由三部分组成(可能只包含部分):
- functions(方法)
- types(类型)
- constants(常量)