请考虑以下代码:
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);
}
test
使用最新的nightly
进行编译,但我无法拨打a(r);
两次。 test2
使用stable
编译并完成我想要的操作,但不会在nightly
上编译。
动机是我有一个RNG,我想在几个不同的时间内进入内部闭包。我需要做些什么来允许test2
编译?
答案 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吗?我怀疑你过多地简化了代码并提出了一个与你想要问的问题不同的问题。