| Thank you for that explanation. In the original blog post an example is shared of reusing a buffer, and I was curious how Rust would handle that scenario. Perplexity suggested the following: // Use a mutable slice to represent the buffer: let mut buffer = [0u8; 16]; // Read into the buffer: let n = socket.read(&mut buffer)?; // To move the partial second row to the beginning, you'd use
safe operations like: let second_row_start = 7; // Index where second row starts buffer.copy_within(second_row_start.., 0); // Then read more data into the remaining space: let remaining_space = &mut buffer[9..]; let additional_bytes = socket.read(remaining_space)?; Is this idiomatic for Rust? |
For the buffer example, the one after "As a made up example, consider:", I'm not sure I would personally write the code to move the previous stuff to the start of the buffer, but instead process the whole buffer, even if that means a partial parse, and then fill the buffer again, finishing the parse.
But if you wanted to translate the "Let's extract this specific example and try:" into Rust:
copy_from_slice is a memcpy: https://doc.rust-lang.org/stable/std/primitive.slice.html#me...This errors at compile time:
We cannot use the help suggestion to make this work, because the slices would be overlapping. But it is a compile time error, not a runtime one. If we did use split_at_mut, that would end up being a runtime panic, because the index comparison happens at runtime.If I wanted to do what the copyForwards example, sure, that works, but you're in the realm of unsafe: https://doc.rust-lang.org/std/ptr/fn.copy.html