【问题标题】:Why must we borrow the type and not the name of the variable为什么我们必须借用类型而不是变量名
【发布时间】: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 也是一种类型
  • 借用语义直接在类型检查器中实现。 &BookBook 是不同的类型。
  • Book 是您拥有的东西。 &Book 是你借来的东西。 &mut Book 是您可变借用的东西。它们是三种不同的类型,就像 BookBox<Book> 是不同的类型一样,它们的核心是以某种方式提供对一本书的访问。
  • @guillaume8375 所以 main() 创建了这本书,因此默认拥有这本书。它让display_page_countdisplay_rating 轮流借书,但缺少mut 告诉他们他们不能在书中涂鸦。 book: &mut Book 仍会借钱,但您明确允许他们涂鸦。但一直以来 main() 仍然拥有这本书。当拥有结构的作用域“不再存在”时,结构也会被释放(尽管高级生命周期会使这复杂化)。这就是 rust 在没有 malloc、垃圾收集或引用计数的情况下的工作方式。

标签: rust borrow-checker ownership ampersand


【解决方案1】:

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

使用fn display_rating(book: Book) 表示法意味着所有权被传递给函数并且不返回它,它不能在外部范围中使用。

book: &Book 表示我们正在使用对变量的引用。在这种情况下,book 可以有任何你想要的名称,因为它只是类型为 &Book 的变量的名称。

【讨论】:

  • 补充:将&T 视为Ref<'_, T>,它是如此常见且如此基本的概念,以至于它拥有自己的语法。所以book: &Book ~ book: Ref<'_, Book>,又名与Book 完全不同的类型。
【解决方案2】:

因为这是声明变量的名称,而不是标记类型。

声明时,所有变量必须是纯名称,名称不能是引用。

&& mut在变量前标记的情况,只是标记变量的类型,而不是名称。

这是因为你刚刚给了一个对象一个名字。改变的是对象的类型,而不是名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-27
    • 2016-11-08
    • 2020-07-22
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多