在Rust中,我有时候会发现自己想写这样的代码:
fn read_possibly_compressed_data(
mut reader: impl Read,
) -> Result<()> {
let is_compressed = reader.read_u8()? == 1;
let reader: &mut dyn Read = if is_compressed {
&mut ZlibDecoder::new(reader)
} else {
&mut reader
};
...
不幸的是,由于显而易见的原因,这不起作用-ZlibDecoder::new()
的生存期只延伸到它的块的末尾,所以我不能返回对它的引用。
显而易见的解决方案是将它放在块之外,但之后必须进行一些初始化,或者可能将它放在Option<>
中:
fn read_possibly_compressed_data(
mut reader: impl Read,
) -> Result<()> {
let is_compressed = reader.read_u8()? == 1;
let mut zlib_decoder = ZlibDecoder::new(Cursor::default());
let reader: &mut dyn Read = if is_compressed {
zlib_decoder = ZlibDecoder::new(reader);
&mut zlib_decoder
} else {
&mut reader
};
...
这比第一个代码刚刚工作的情况稍差一些。有没有我遗漏的更好的方法
1条答案
按热度按时间k2fxgqgv1#
我在写这篇文章的时候找到了答案,在Rust优秀的错误信息的指导下,你可以在块外声明变量,假设流控制是正确的,你不必初始化它: