我刚刚在 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)
使用这种声明变量 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。