use std::fs::File;
use std::io;
use std::io::Read;
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)
}
上面这段代码,?的作用是:
如果返回Result::OK(T),则f类型为T;
如果返回Result::Err(error),则函数返回Result::Err(error)
是这个意思呗?
UUUUUUUUUUUUUUUUUUUUUUUU
是的,您的理解是正确的!在这段代码中,?
运算符用于简化错误处理,它的作用就是:
- 如果
Result
是Ok(T)
,则提取其中的值T
,并继续执行下一步的代码。 - 如果
Result
是Err(error)
,则会立即从当前函数返回这个Err(error)
,不再执行后续的代码。
详细解释:
-
let mut f = File::open("hello.txt")?;
File::open("hello.txt")
返回一个Result<File, io::Error>
,即成功时返回Ok(File)
,失败时返回Err(io::Error)
。- 如果
Result
是Ok(f)
,那么f
就是File
类型的对象,程序继续执行。 - 如果
Result
是Err(error)
,?
运算符会让当前函数read_username_from_file
立即返回Err(error)
,所以不会执行后续的代码。
- 如果
-
f.read_to_string(&mut s)?;
f.read_to_string(&mut s)
返回一个Result<usize, io::Error>
,即成功时返回Ok(usize)
(表示读取的字节数),失败时返回Err(io::Error)
。- 如果
Result
是Ok(_)
,程序继续执行。 - 如果
Result
是Err(error)
,?
运算符会让函数立刻返回Err(error)
。
- 如果
整个函数流程:
- 如果在打开文件或者读取文件时遇到错误,
?
会让read_username_from_file
函数返回Err(io::Error)
,并且不会执行后续的代码。 - 如果一切正常,函数会继续执行,直到最后
Ok(s)
被返回。
举个例子:
假设文件 hello.txt
不存在,File::open("hello.txt")
会返回 Err(io::Error)
。然后,?
运算符会直接让 read_username_from_file
函数返回这个 Err(io::Error)
,不会再去调用 f.read_to_string(&mut s)
。
而如果文件存在并成功打开,f.read_to_string(&mut s)
会尝试读取内容,并且只有在出现读取错误时才会返回 Err
。
总结:
?
运算符是用来简化错误处理的工具,它的作用是:
- 如果
Result
是Ok(T)
,返回其中的T
。 - 如果
Result
是Err(E)
,则提前从函数返回Err(E)
。
因此,您的理解完全正确!
标签:返回,Ok,Err,read,Result,error From: https://www.cnblogs.com/Tifahfyf/p/18627929