为什么要使用嵌套块?

Jan*_*sen 4 rust

我刚刚在 base64 crate 中发现了这段代码:

 buffer.resize(decoded_len_estimate, 0);

let bytes_written;
{
    let buffer_slice = &mut buffer.as_mut_slice()[starting_output_len..];
    bytes_written = decode_helper(input_bytes, num_chunks, config, buffer_slice)?;
}

buffer.truncate(starting_output_len + bytes_written);
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/marshallpierce/rust-base64/blob/b63975f0a3d2e724c611bf6cd7213ae6bcb065a3/src/decode.rs#L165-L169

使用这种声明变量 bytes_writing 的方式然后使用这个嵌套块的原因是什么?这解决了什么问题?为什么不直接使用这段代码:

 buffer.resize(decoded_len_estimate, 0);

let buffer_slice = &mut buffer.as_mut_slice()[starting_output_len..];
let bytes_written = decode_helper(input_bytes, num_chunks, config, buffer_slice)?  
buffer.truncate(starting_output_len + bytes_written);
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

Cha*_*man 19

这段代码是在 4 年前(2017 年 12 月 5 日)编写的,在NLL(非词汇生命周期)到来之前(2018 年 12 月 6 日)。使用 NLL,借用检查器会认为引用“有效”,直到最后一次使用为止。但如果没有它,引用将被认为是活动的,直到范围结束(其删除)。由于buffer_slice借用buffer是可变的,并且最后一行也这样做,因此 NLL 之前的借用检查器会出错 - 这可能就是他们引入该块的原因,以创建一个新的作用域,以便在下buffer_slice一次借用 之前将其删除buffer