rust 将临时变量的生存期延长到其块外部

bfnvny8b  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(104)

在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
    };

    ...

这比第一个代码刚刚工作的情况稍差一些。有没有我遗漏的更好的方法

k2fxgqgv

k2fxgqgv1#

我在写这篇文章的时候找到了答案,在Rust优秀的错误信息的指导下,你可以在块外声明变量,假设流控制是正确的,你不必初始化它:

fn read_possibly_compressed_data(
    mut reader: impl Read,
) -> Result<()> {
    let is_compressed = reader.read_u8()? == 1;

    let mut zlib_decoder;

    let reader: &mut dyn Read = if is_compressed {
        zlib_decoder = ZlibDecoder::new(reader);
        &mut zlib_decoder
    } else {
        &mut reader
    };

    ...

相关问题