我正在try 实现一个函数,它将在几个相关的2D数组(它们总是具有相同的大小)的所有可能索引范围内构造迭代器.然而,编译器给了我一个错误,说我传递给map
的闭包没有实现Fn
,只实现了FnMut
.这是我的原始代码:
pub fn get_index_iterator(&self) -> Map<Range<usize>, impl Fn(usize) -> (usize, usize)> {
(0usize..(self.width * self.height))
.map(|idx| -> (usize, usize) {
(idx % self.width, idx / self.width)
}
)
}
为了弄清楚到底是怎么回事,我最终try 用下面的代码替换它:
pub fn get_index_iterator(&self) -> Map<Range<usize>, impl Fn(usize) -> (usize, usize)> {
(0usize..(self.width * self.height))
.map(|idx| -> (usize, usize) {
(0usize, 0usize)
}
)
}
只是为了查看错误是否会更改为更有帮助的内容,但事实并非如此,错误仍然存在
expected a `std::ops::Fn<(usize,)>` closure, found `[closure@src\lib.rs:33:18: 33:41]`
the trait `std::ops::Fn<(usize,)>` is not implemented for closure `[closure@src\lib.rs:33:18: 33:41]`
`[closure@src\lib.rs:33:18: 33:41]` implements `FnMut`, but it must implement `Fn`, which is more general
适用于两个版本.我看不出返回一个常量而不做任何其他事情的闭包怎么可能改变它的环境状态.我错过了什么吗?