【Rust】引用
在 Rust
中,指针按是否有所有权属性可以分为两类,例如 Box<T>
,String
,或者 Vec
具有所有权属性的指针(owning pointers
),可以说它们拥有指向的内存,当它们被删除时,指向的内存也会被被释放掉。但是,也有一种非所有权指针,叫做引用(references)
,它们的存在不会影响指向值的生命周期,在 Rust
中创建引用的行为称之为对值的借用。
要注意的是,引用决不能超过其引用的值的生命周期。必须在代码中明确指出,任何引用都不可能超过它所指向的值的寿命。为了强调这一点,Rust
将创建对某个值的引用称为借用:你所借的东西,最终必须归还给它的所有者。
引用值
在《【Rust】所有权》章节中,我们说到函数传值会转移值得所有权,for
循环也会,例如,对下面的代码,我们在将 table
传递给 show
函数之后,table
就处于未初始化状态:
1 | use std::collections::HashMap; |
如果在 show
函数之后,我们再想使用 table
变量就会报错,例如:
1 | ... |
Rust
编译器提示变量 table
已经不可用,show
函数的调用已经转移 table
的所有权:
error[E0382]: borrow of moved value: `table`
--> src/main.rs:24:16
|
13 | let mut table = Table::new();
| --------- move occurs because `table` has type `HashMap<String, Vec<String>>`, which does not implement the `Copy` trait
...
23 | show(table);
| ----- value moved here
24 | assert_eq!(table["Gesualdo"][0], "many madrigals");
| ^^^^^ value borrowed here after move