有一个非常不错的split_at_mut函数,它可以占用1个slice并将其分成2个......有一种方法可以撤消该操作,以便我可以再次回到原来的数组-假设我知道它们在内存中是连续的(因为我只是拆分它们)
问题是:是否有类似于join_mut这样的东西:
fn main() {
let mut item : [u8;32] = [0u8;32];
let (mut first, mut second) = item[..].split_at_mut(16);
first[0] = 4;
second[0] = 8;
let mut x = first.join_mut(first, second); // <-- compile error
assert_eq(x[16], 8);
}
Run Code Online (Sandbox Code Playgroud)
标准库中没有这样的功能,可能是因为这是一个相当小众的情况,通常可以通过使用在第一种情况下分割的切片来解决。
话虽这么说,但由于存在一些不安全因素,可能会实现该功能。
fn join_mut<'a, T>(first: &'a mut [T], second: &'a mut [T]) -> Option<&'a mut [T]> {
let fl = first.len();
if first[fl..].as_mut_ptr() == second.as_mut_ptr() {
unsafe {
Some(::std::slice::from_raw_parts_mut(first.as_mut_ptr(), fl + second.len()))
}
}
else {
None
}
}
Run Code Online (Sandbox Code Playgroud)