首页 > 解决方案 > Rust - 为什么我需要将对字符串的引用而不是字符串的引用传递给 std::io::read_line?

问题描述

我正在阅读这个 Rust 教程 - https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html - 并遇到了这段代码:

let mut guess = String::new();

io::stdin()
    .read_line(&mut guess)
    .expect("Failed to read line");

我的困惑是为什么我们需要传递对guess变量的引用,而不仅仅是变量本身。这样设计有什么原因吗?

在我的理解中,guess是一个保存内存地址的指针。然后,如果guess像这样取消引用*guess,这将返回保存字符串的内存地址的值。

因此,该read_line函数似乎只需要读取字符串的地址。即,称为:(read_line(guess)read_line(mut guess))。

我很困惑为什么这是不可能的,为什么read_line定义为引用一个字符串,这是一个“指针”(?)的地址,而不是字符串(指针)本身。

标签: pointersrust

解决方案


该变量guess实际上不是一个指针,而是一个包含指向某个内存的指针的结构,以及该分配内存的大小。如果你取消引用一个字符串,你会得到一个切片,它有一个指向底层内存的指针,以及进入该内存的窗口大小,但不能修改指针和大小。切片不是被引用内存的所有者。为了修改大小或为 String 分配新的底层内存,您需要对 String 的引用,因此需要 mut 引用


推荐阅读