如何修复因RFC 1214导致的生命周期错误

时间:2016-01-10 17:58:12

标签: rust lifetime

请考虑以下代码:

pub fn use_r<I, R>(xs: I, r: &R) {
    unimplemented!()
}

fn test<'a, R>(r: &'a mut R) {
    let a = |r: &'a mut R| {
        [(|| use_r(vec![0.].into_iter(), r))()]
    };
    a(r);
    // a(r);
}

fn test2<R>(r: &mut R) {
    let a = |r: &mut R| {
        [(|| use_r(vec![0.].into_iter(), r))()]
    };
    a(r);
    a(r);
}

Rust Playground

test使用最新的nightly进行编译,但我无法拨打a(r);两次。 test2使用stable编译并完成我想要的操作,但不会在nightly上编译。

动机是我有一个RNG,我想在几个不同的时间内进入内部闭包。我需要做些什么来允许test2编译?

1 个答案:

答案 0 :(得分:1)

我不确定编译器为什么不接受您的test2功能。如果你消除了不必要的嵌套lambda,它编译得很好:

fn test2<R>(r: &mut R) {
    let a = |r: &mut R| {
        [use_r(vec![0.].into_iter(), r)]
    };
    a(r);
    a(r);
}

我还发现,如果您使用具有显式生存期的共享引用,编译器会接受代码:

fn test2<'a, R>(r: &'a mut R) {
    let a = |r: &'a R| {
        [(|| use_r(vec![0.].into_iter(), r))()]
    };
    a(r);
    a(r);
}

我不确定为什么它不能使用&mut引用,或者为什么编译器无法自动推断生命周期。

你真的有一个不必要的(立即调用的)嵌套lambda吗?我怀疑你过多地简化了代码并提出了一个与你想要问的问题不同的问题。