Rust 选项::映射(FNOCE)似乎不接受FNOCE。。。?

Rust 选项::映射(FNOCE)似乎不接受FNOCE。。。?,rust,Rust,我被选项::map()弄糊涂了。表示它接受一次fn 如果是这样,为什么a和b会导致编译错误 let mut v = 3; let mut a: &FnOnce(u32) -> u32 = &|x: u32| { v = x; x }; let mut b: &FnMut(u32) -> u32 = &|x: u32| { x }; let mut c: &Fn(u32) -> u32 = &|x: u32| { x }; le

我被
选项::map()
弄糊涂了。表示它接受一次
fn

如果是这样,为什么
a
b
会导致编译错误

let mut v = 3;

let mut a: &FnOnce(u32) -> u32 = &|x: u32| { v = x; x };
let mut b: &FnMut(u32) -> u32 = &|x: u32| { x };
let mut c: &Fn(u32) -> u32 = &|x: u32| { x };

let o = Option::Some(3);

o.map(a); // trait bound `std::ops::FnOnce(u32) -> u32: std::ops::Fn<(u32,)>` is not satisfied
o.map(b); // trait bound `std::ops::FnMut(u32) -> u32: std::ops::Fn<(u32,)>` is not satisfied
o.map(c); // works
让mut v=3;
设mut a:&FnOnce(u32)->u32=&x:u32{v=x;x};
设mutb:&FnMut(u32)->u32=&x:u32{x};
设mutc:&Fn(u32)->u32=&x:u32{x};
设o=Option::Some(3);
o、 地图(a);//特性绑定的'std::ops::FnOnce(u32)->u32:std::ops::Fn'不满足
o、 地图(b);//特性绑定的'std::ops::FnMut(u32)->u32:std::ops::Fn'不满足
o、 地图(c);//作品

所有这些,包括
a
b
,是否都应该根据?

实现
fnone
。问题是,您不是直接用
fnone
调用
选项::map
,而是用
&fnone
调用

但是,如果您查看,您会注意到虽然
FnOnce
是为
&Fn
实现的,但它不是为
&FnOnce
&FnMut
实现的。 要理解为什么,请考虑以下内容:

let a: &FnOnce(u32) -> u32 = &|x: u32| { v = x; x };
let b: &FnOnce(u32) -> u32 = a;

a(42); // would be allowed if `&FnOnce: FnOnce`, moves `a`
       // actually gives: 
       // error[E0507]: cannot move out of borrowed content
a(6);  // would not be allowed as `a` was moved
b(7);  // would be allowed if `&FnOnce: FnOnce`
       // oh no! this calls the function again!