【发布时间】:2016-07-22 18:52:57
【问题描述】:
有一个非常好的 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);
}
【问题讨论】:
-
我不确定我是否理解。既然
first和second只是item的一部分,为什么不使用item本身而不是尝试加入它们呢?将x替换为item中的assert_eq!(item[16], 8);将通过测试(假设您归还了借来的切片)或者这只是您实际尝试做的简化? -
在这个简化的例子中是合理的。但是让我们假设您正在制作某种分配器,并且您将 2 个未连接的切片返回给客户端并且它们都被释放了,因此您希望能够将它们连接成更大的切片。在这种情况下,您肯定会忘记每个切片的来源,也不会知道原始项目,因为它通过 split_at_mut 借用了数十个其他切片
-
有问题的确切情况在这里:github.com/dropbox/rust-alloc-no-stdlib/blob/master/src/… in free_cell 其中 &'a mut 切片被返回到系统,很高兴看看它们是否可以与其他 free'd 重新组合切片以统一它们