Rust 在闭包中使用split_at_mut时出现锈蚀错误E0495

Rust 在闭包中使用split_at_mut时出现锈蚀错误E0495,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,我遇到一个“错误[E0495]:由于需求冲突,无法推断autoref的适当生存期”,使用此简单函数: fn assign_split_at_mut<'a, 'b, T>(s: &'b mut &'a mut [T], mid: usize) -> &'a mut [T] { let (x, y) = (*s: &'a mut [T]).split_at_mut(mid); *s = y; x } 事实上,我想大致这样写:

我遇到一个“错误[E0495]:由于需求冲突,无法推断autoref的适当生存期”,使用此简单函数:

fn assign_split_at_mut<'a, 'b, T>(s: &'b mut &'a mut [T], mid: usize) -> &'a mut [T] {
    let (x, y) = (*s: &'a mut [T]).split_at_mut(mid);
    *s = y;
    x
}
事实上,我想大致这样写:

pub fn slice_header<'a>(&'static self, mut header: &'a mut [u8])
  -> MyResult<HeaderRefs<'a>>
{
    // ...
    let take = |l: usize| -> &'a mut [u8] {
        let (x,y) = header.split_at_mut(l);
        header = y;  x
    };
    let hr = HeaderRefs {
        params: self,
        alpha: array_mut_ref![take(32),0,32],
        gamma: array_mut_ref![take(16),32,16],
        beta: take(self.beta_length as usize),
        surb_log: take(self.surblog_length as usize),
        surb: take(self.surb_length()),
    };
    // ...
    Ok(hr)
}
如果我把它们放到一个数组里也许会有用。我不能让它与关闭,这将看起来干净得多的工作

IRC用户通过使用
mem::replace
将首先需要变异的
&mut[T]
移开,提供了一个清晰的答案:

fn reserve<'heap, T>(heap: &mut &'heap mut [T], len: usize) -> &'heap mut [T] {
    let tmp: &'heap mut [T] = ::std::mem::replace(&mut *heap, &mut []);
    let (reserved, tmp) = tmp.split_at_mut(len);
    *heap = tmp;
    reserved
}
fn reserve和'heap mut[T]{
让tmp:&'heap mut[T]=::std::mem::replace(&mut*heap,&mut[]);
let(reserved,tmp)=tmp.split_at_mut(len);
*heap=tmp;
含蓄的
}

这是一个借款问题:

fn assign_split_at_mut<'a, 'b, T>(s: &'b mut &'a mut [T], mid: usize) -> &'a mut [T] {
    let (x, y) = (*s: &'a mut [T]).split_at_mut(mid);
    *s = y;
    x
}

我会为“跳舞”给出这个最好的答案;)@杰夫伯吉斯:是的,这就像当你的舞伴(借书人)已经知道所有的舞步时学习跳舞一样。当你刚开始的时候,你经常踩着他们的脚,但随着时间的推移,你的动作会慢慢变慢。最终,你可以开始预测他们的动作,开始欣赏舞蹈中的音乐,而不仅仅是专注于把脚放在正确的位置。在face中,nox的建议缺少
tmp
上的类型注释。我添加它是出于不必要的妄想。
fn reserve<'heap, T>(heap: &mut &'heap mut [T], len: usize) -> &'heap mut [T] {
    let tmp: &'heap mut [T] = ::std::mem::replace(&mut *heap, &mut []);
    let (reserved, tmp) = tmp.split_at_mut(len);
    *heap = tmp;
    reserved
}
fn assign_split_at_mut<'a, 'b, T>(s: &'b mut &'a mut [T], mid: usize) -> &'a mut [T] {
    let (x, y) = (*s: &'a mut [T]).split_at_mut(mid);
    *s = y;
    x
}
fn reserve<'heap, T>(heap: &mut &'heap mut [T], len: usize) -> &'heap mut [T] {
    let tmp: &'heap mut [T] = ::std::mem::replace(&mut *heap, &mut []);
    let (reserved, tmp) = tmp.split_at_mut(len);
    *heap = tmp;
    reserved
}