1つのスライスを2つにすることができる非常に良いsplit_at_mut関数があります... 私は元の配列に再び戻ることができるようにその操作を元に戻す方法があります - 私はそれらが連続していることを仮定することができますメモリ内の質問があるRust:split_at_mut(つまり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);
}
私は理解していません。 'first'と' second'は 'item'の単なるスライスなので、' item'自体をそれらに戻そうとせずに使ってみましょう。 'assert_eq!(item [16]、8);のように' x'を 'item'と置き換えると、テストに合格します(実際にやっていることを単純化したものです) ? –
この単純化された例では合理的なことです。しかし、あなたが何らかのアロケータを作っていると仮定し、2つの結合されていないスライスをクライアントに返して、どちらも解放されたので、より大きなスライスに結合できるようにしたいと考えてください。その場合、split_at_mutから他のスライスを借りて何十個ものスライスがあるので、各スライスの元の位置が失われたり元のアイテムが失われることになります。 – hellcatv
問題の正確な状況は次のとおりです。https://github.com /dropbox/rust-alloc-no-stdlib/blob/master/src/stack_allocator.rs free_cellには、 'mutスライスがシステムに返されていて、他のフリースライスと再結合できるかどうかを確認するのがいいでしょう。それらを統一するためのスライス – hellcatv