Rust:split_at_mut(即join_mut)是否有相反的说法?

hel*_*atv 1 split slice rust

有一个非常不错的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)

Mar*_*Mar 5

标准库中没有这样的功能,可能是因为这是一个相当小众的情况,通常可以通过使用在第一种情况下分割的切片来解决。

话虽这么说,但由于存在一些不安全因素,可能会实现该功能。

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)

操场

  • @hellcatv我发现了这个问题http://stackoverflow.com/questions/4909766/is-it-unspecified-behavior-to-compare-pointers-to-different-arrays-for-equality,它表示未为&lt;, &gt;等,但是==和!=返回定义的结果,因此我认为至少对于C ++,在检查两个指针​​的相等性时没有未定义的行为。Rust可能也不会对此进行指定。 (2认同)