【发布时间】:2021-11-08 06:56:06
【问题描述】:
在以下代码中:
struct Book {
pages: i32,
rating: i32,
}
fn display_page_count(book: &Book) {
println!("Pages = {:?}", book.pages);
}
fn display_rating(book: &Book) {
println!("Rating = {:?}", book.rating);
}
fn main() {
let book = Book {
pages: 5,
rating: 9,
};
display_page_count(&book);
display_rating(&book);
}
为什么我们写fn display_page_count(book: &Book) 而不是fn display_page_count(&book: Book)?对我来说,book 是我们稍后要借用的数据,Book 只是一个类型(这里是struct),所以我不明白为什么我们必须借用类型而不是变量或范围。谁能告诉我为什么我错了?
【问题讨论】:
-
它告诉你它是类型“借书”而不是类型“可变借书”或类型“自有书”
-
因为
&Book也是一种类型 -
借用语义直接在类型检查器中实现。
&Book与Book是不同的类型。 -
Book是您拥有的东西。&Book是你借来的东西。&mut Book是您可变借用的东西。它们是三种不同的类型,就像Book和Box<Book>是不同的类型一样,它们的核心是以某种方式提供对一本书的访问。 -
@guillaume8375 所以 main() 创建了这本书,因此默认拥有这本书。它让
display_page_count和display_rating轮流借书,但缺少mut告诉他们他们不能在书中涂鸦。book: &mut Book仍会借钱,但您明确允许他们涂鸦。但一直以来 main() 仍然拥有这本书。当拥有结构的作用域“不再存在”时,结构也会被释放(尽管高级生命周期会使这复杂化)。这就是 rust 在没有 malloc、垃圾收集或引用计数的情况下的工作方式。
标签: rust borrow-checker ownership ampersand