Hash trait 可以实例化一个任意大小的类型,并且能够用哈希(hash)函数将该实例映射到一个固定大
小的值上。派生 Hash 实现了 hash 方法。hash 方法的派生实现结合了在类型的每部分调用 hash 的结
果,这意味着所有的字段或值也必须实现了 Hash,这样才能够派生 Hash。
例如,在 HashMap<K, V> 上存储数据,存放 key 的时候,Hash 是必须的。
默认值的 Default
Default trait 使你创建一个类型的默认值。派生 Default 实现了 default 函数。default 函数的派生实现
调用了类型每部分的 default 函数,这意味着类型中所有的字段或值也必须实现了 Default,这样才能够
派生 Default 。
Default::default 函数通常结合结构体更新语法一起使用,这在第五章的 ” 使用结构体更新语法
从其他实例中创建实例” 部分有讨论。可以自定义一个结构体的一小部分字段而剩余字段则使用
.. Default::default() 设置为默认值。
例如,当你在 Option<T> 实例上使用 unwrap_or_default 方法时,Default trait 是必须的。如果
Option<T> 是 None的话, unwrap_or_default 方法将返回存储在 Option<T> 中 T 类型的 Default::default
的结果。
附录 D:实用开发工具
appendix-04-useful-development-tools.md > commit d48e9884f4e5ecb112095d4e8c55ebc3bce4b009
本附录,我们将讨论 Rust 项目提供的用于开发 Rust 代码的工具。
通过 rustfmt 自动格式化
rustfmt 工具根据社区代码风格格式化代码。很多项目使用 rustfmt 来避免编写 Rust 风格的争论:所有
人都用这个工具格式化代码!
安装 rustfmt:
$ rustup component add rustfmt
这会提供 rustfmt 和 cargo−fmt,类似于 Rust 同时安装 rustc 和 cargo。为了格式化整个 Cargo 项目:
$ cargo fmt
运行此命令会格式化当前 crate 中所有的 Rust 代码。这应该只会改变代码风格,而不是代码语义。请查
看 该文档 了解 rustfmt 的更多信息。
通过 rustfix 修复代码
如果你编写过 Rust 代码,那么你可能见过编译器警告。例如,考虑如下代码:
文件名: src∕main.rs
fn do_something() {}
fn main() {
for i in 0..100 {
do_something();
}
}
这里调用了 do_something 函数 100 次,不过从未在 for 循环体中使用变量 i。Rust 会警告说:
$ cargo build
Compiling myprogram v0.1.0 (file:///projects/myprogram)
warning: unused variable: `i`
--> src/main.rs:4:9
|
4 | for i in 1..100 {
| ^ help: consider using `_i` instead
|
= note: #[warn(unused_variables)] on by default
Finished dev [unoptimized + debuginfo] target(s) in 0.50s
警告中建议使用 _i 名称:下划线表明该变量有意不使用。我们可以通过 cargo fix 命令使用 rustfix 工具
来自动采用该建议:
586 CHAPTER 21. 附录
$ cargo fix
Checking myprogram v0.1.0 (file:///projects/myprogram)
Fixing src/main.rs (1 fix)
Finished dev [unoptimized + debuginfo] target(s) in 0.59s
如果再次查看 src∕main.rs,会发现 cargo fix 修改了代码:
文件名: src∕main.rs
fn do_something() {}
fn main() {
for _i in 0..100 {
do_something();
}
}
现在 for 循环变量变为 _i,警告也不再出现。
cargo fix 命令可以用于在不同 Rust 版本间迁移代码。版本在附录 E 中介绍。