面试题答案
一键面试- I/O错误:
- 原因:当向控制台输出信息时,底层的I/O操作可能会失败,例如磁盘满、设备故障等。
- 处理方式:使用
Result
类型。std::io::Write
trait的write_fmt
方法返回Result
。可以使用try!
宏(或?
操作符在Rust 1.13+)来处理可能的I/O错误。 - 代码示例:
use std::io::Write;
fn main() -> std::io::Result<()> {
let mut stdout = std::io::stdout();
try!(stdout.write_fmt(format_args!("Hello, world!")));
Ok(())
}
在Rust 1.13+可以写成:
use std::io::Write;
fn main() -> std::io::Result<()> {
let mut stdout = std::io::stdout();
stdout.write_fmt(format_args!("Hello, world!"))?;
Ok(())
}
- 格式化错误:
- 原因:如果格式化字符串与提供的参数不匹配,就会出现格式化错误。例如,使用
{}
占位符期望一个Debug
实现的类型,但提供的类型没有实现Debug
。 - 处理方式:同样使用
Result
类型。std::fmt::Write
trait的write_fmt
方法返回Result
。可以使用try!
宏(或?
操作符)处理错误。 - 代码示例:
- 原因:如果格式化字符串与提供的参数不匹配,就会出现格式化错误。例如,使用
struct NoDebug;
fn main() -> std::fmt::Result {
let mut s = String::new();
try!(s.write_fmt(format_args!("{:?}", NoDebug)));
Ok(())
}
这里NoDebug
类型没有实现Debug
trait,write_fmt
会返回一个错误。使用try!
宏来处理这个错误。在Rust 1.13+也可以使用?
操作符:
struct NoDebug;
fn main() -> std::fmt::Result {
let mut s = String::new();
s.write_fmt(format_args!("{:?}", NoDebug))?;
Ok(())
}
Option
相关潜在错误(在一些间接场景下):- 原因:假设获取控制台输出流是通过一个返回
Option
的函数,例如在一个更复杂的逻辑中,获取流可能失败。 - 处理方式:使用
Option
类型的ok_or
方法将Option
转换为Result
,然后再使用try!
或?
处理可能的错误。 - 代码示例:
- 原因:假设获取控制台输出流是通过一个返回
fn get_stdout() -> Option<std::io::Stdout> {
Some(std::io::stdout())
}
fn main() -> std::io::Result<()> {
let mut stdout = get_stdout().ok_or(std::io::Error::new(std::io::ErrorKind::Other, "Failed to get stdout"))?;
stdout.write_fmt(format_args!("Hello from Option scenario!"))?;
Ok(())
}
这里get_stdout
函数模拟了一个可能返回None
的情况,使用ok_or
将Option
转换为Result
并处理潜在的失败。