gpt4 book ai didi

rust - 当 Rust 中的函数需要可变引用时,为什么不可变引用可以匹配工作?

转载 作者:行者123 更新时间:2023-12-03 11:30:26 24 4
gpt4 key购买 nike

嗨,我目前正在阅读 Rust 编程语言书。在错误处理章节中,我发现这段代码运行良好:

fn read_username_from_file() -> Result<String, io::Error> {
let f = File::open("hello.txt");

let mut f = match f {
Ok(file) => file,
Err(e) => return Err(e),
};

let mut s = String::new();

match f.read_to_string(&mut s) {
Ok(_) => Ok(s),
Err(e) => Err(e),
}
}
但是,使用 ? 重写后运算符,代码只能以这种方式工作:
fn read_username_from_file() -> Result<String, io::Error> {
let mut f = File::open("hello.txt")?;

let mut s = String::new();

f.read_to_string(&mut s)?;

Ok(s)
}
请注意 f现在变得可变!在第一个版本 f是不可变的。 read_to_string的定义是 fn read_to_string(&mut self, buf: &mut String) -> Result<usize> ,这需要一个可变的 self引用。但是为什么第一个版本在这里没有编译时错误? f ( self ) 在这里是不可变的!

最佳答案

在第一个版本中,第一个 f是不可变的,但是你隐藏它并绑定(bind) f可变:

fn read_username_from_file() -> Result<String, io::Error> {
let f = File::open("hello.txt"); // this is immutable

let mut f = match f { ... } // this is mutable
}
read_to_string 函数采用对 self 的可变引用,所以在这两个例子中, f必须是可变的。

关于rust - 当 Rust 中的函数需要可变引用时,为什么不可变引用可以匹配工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65865423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com