pointers - 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
定义为引用一个字符串,这是一个“指针”(?)的地址,而不是字符串(指针)本身。
解决方案
该变量guess
实际上不是一个指针,而是一个包含指向某个内存的指针的结构,以及该分配内存的大小。如果你取消引用一个字符串,你会得到一个切片,它有一个指向底层内存的指针,以及进入该内存的窗口大小,但不能修改指针和大小。切片不是被引用内存的所有者。为了修改大小或为 String 分配新的底层内存,您需要对 String 的引用,因此需要 mut 引用
推荐阅读
- java - 从android本地获取文件路径和名称
- mysql - Entity Framework Core 初始创建 MySql
- azure-web-app-service - 将 Azure AD B2C 与 Azure 应用服务集成的最简单方法是什么
- reactjs - Apollo Client + NextJs 认证问题
- python - 在 Pandas 的日期列上将分钟/秒归零
- r - 将嵌套的 JSON 转换为数据框
- java - java.time.Year#range 不返回一年中的具体星期(Java 1.8)
- javascript - align-self:flex start 没有将子元素发送到顶部
- android - Firebase 获取最后插入项目的密钥
- windows-store-apps - 找不到包含“UAP 10.0.17763.0”的“UAP.props”的 APPX321 SDK 文件夹