Rust:split_at_mut 有反义词吗(即 join_mut)?
Rust: Is there an opposite for split_at_mut (i.e. join_mut)?
有一个非常好的 split_at_mut 函数可以将 1 个切片变成 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);
}
标准库中没有这样的函数,可能是因为它是一个相当小众的情况,通常可以使用第一种情况下分割的切片来解决。
话虽这么说,但有一点不安全是可以实现该功能的。
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
}
}
有一个非常好的 split_at_mut 函数可以将 1 个切片变成 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);
}
标准库中没有这样的函数,可能是因为它是一个相当小众的情况,通常可以使用第一种情况下分割的切片来解决。
话虽这么说,但有一点不安全是可以实现该功能的。
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
}
}