为什么我们必须借用变量的类型而不是名称

gui*_*375 5 ownership ampersand rust borrow-checker

在下面的代码中:

\n
struct Book {\n    pages: i32,\n    rating: i32,\n}\n\nfn display_page_count(book: &Book) {\n    println!("Pages = {:?}", book.pages);\n}\n\nfn display_rating(book: &Book) {\n    println!("Rating = {:?}", book.rating);\n}\n\nfn main() {\n    let book = Book {\n    pages: 5,\n    rating: 9,\n    };\n    display_page_count(&book);\n    display_rating(&book);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我们为什么写fn display_page_count(book: &Book)而不写fn display_page_count(&book: Book)?对我来说,book我们\xe2\x80\x99稍后想要借用的数据Book只是一个类型(struct这里是a),所以我不\xe2\x80\x99不明白为什么我们必须借用类型而不是变量或参数。有人能告诉我为什么我\xe2\x80\x99m 错了吗?

\n

小智 1

fn display_rating(book: &Book)声明中,book是类型为 的变量的名称&Book

使用该fn display_rating(book: Book)符号意味着所有权被传递给函数,并且如果不返回它,则不能在外部作用域中使用它。

book: &Book意味着我们正在使用对变量的引用。在这种情况下,book可以有任何您想要的名称,因为它只是 type 变量的名称&Book

  • 补充一下:将 `&T` 想象为 `Ref<'_, T>`,它是如此常见且如此基本的概念,以至于它有自己的语法。所以 `book: &Book` ~ `book: Ref<'_, Book>`,又名与 `Book` 完全不同的类型。 (2认同)