面试题答案
一键面试use std::fs::File;
use std::io::{self, Read};
use std::thread;
fn main() {
let handle = thread::spawn(|| {
let mut file = match File::open("nonexistent_file.txt") {
Ok(file) => file,
Err(e) => {
eprintln!("Failed to open file: {}", e);
return;
}
};
let mut content = String::new();
match file.read_to_string(&mut content) {
Ok(_) => println!("File content: {}", content),
Err(e) => eprintln!("Failed to read file: {}", e),
}
});
if let Err(e) = handle.join() {
eprintln!("Thread panicked: {}", e);
}
}
在上述代码中,try
方法在Rust 1.13版本之前是Result
类型的方法,用于更简洁地处理错误,在1.13版本之后引入了?
操作符,其功能与try
类似但更简洁。在上述场景中,如果使用try
(这里用?
替代),代码可以写成如下形式:
use std::fs::File;
use std::io::{self, Read};
use std::thread;
fn main() {
let handle = thread::spawn(|| {
let mut file = File::open("nonexistent_file.txt")?;
let mut content = String::new();
file.read_to_string(&mut content)?;
println!("File content: {}", content);
Ok(())
});
if let Err(e) = handle.join() {
eprintln!("Thread panicked: {}", e);
}
}
try
方法(这里体现为?
操作符)的作用是:当Result
类型是Err
时,直接返回Err
值,将错误传播出去,而无需显式地使用match
语句处理错误。在上述线程代码中,如果文件打开或读取失败,?
操作符会将错误返回,线程会提前结束,避免继续执行后续可能依赖于成功读取文件的代码。这样可以让错误处理代码更加简洁明了,提升代码的可读性。