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!