【发布时间】:2020-09-29 01:13:10
【问题描述】:
我认为这两种方法是等价的,但是有一个错误。是什么原因?有没有更好的表达方式?
pub fn create_pair() -> () {
let vec_num = vec![1, 2, 3];
let vec_num2 = &vec_num;
let all = &vec_num
.iter()
.flat_map(move |a| vec_num2.iter().map(move |b| [a, b]))
.collect::<Vec<_>>();
println!("{:?}", all);
}
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
pub fn create_pair() -> () {
let vec_num = vec![1, 2, 3];
let all = &vec_num
.iter()
.flat_map(move |a| &vec_num.iter().map(move |b| [a, b]))
.collect::<Vec<_>>();
println!("{:?}", all);
}
error[E0277]: `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>` is not an iterator
--> src/main.rs:5:10
|
5 | .flat_map(move |a| &vec_num.iter().map(move |b| [a, b]))
| ^^^^^^^^ `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>` is not an iterator
|
= help: the trait `std::iter::Iterator` is not implemented for `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>`
= note: required because of the requirements on the impl of `std::iter::IntoIterator` for `&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>`
error[E0599]: no method named `collect` found for struct `std::iter::FlatMap<std::slice::Iter<'_, {integer}>, &std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>, [closure@src/main.rs:5:19: 5:64 vec_num:_]>` in the current scope
--> src/main.rs:6:10
|
6 | .collect::<Vec<_>>();
| ^^^^^^^ method not found in `std::iter::FlatMap<std::slice::Iter<'_, {integer}>, &std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>, [closure@src/main.rs:5:19: 5:64 vec_num:_]>`
|
= note: the method `collect` exists but the following trait bounds were not satisfied:
`&std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>: std::iter::IntoIterator`
which is required by `std::iter::FlatMap<std::slice::Iter<'_, {integer}>, &std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>, [closure@src/main.rs:5:19: 5:64 vec_num:_]>: std::iter::Iterator`
`std::iter::FlatMap<std::slice::Iter<'_, {integer}>, &std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>, [closure@src/main.rs:5:19: 5:64 vec_num:_]>: std::iter::Iterator`
which is required by `&mut std::iter::FlatMap<std::slice::Iter<'_, {integer}>, &std::iter::Map<std::slice::Iter<'_, {integer}>, [closure@src/main.rs:5:48: 5:63 a:_]>, [closure@src/main.rs:5:19: 5:64 vec_num:_]>: std::iter::Iterator`
【问题讨论】:
-
您的问题似乎可以通过Why can't I use
&Iterator<Item = &String>as an iterator? 和Is there any way to return a reference to a variable created in a function? 的答案得到解答。如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。 -
第二个
create_pair有多个问题。首先,precedence of&is lower than.,所以&vec_num.iter()的行为不像您期望的那样。其次,movecauses the value of any captured variable to be moved,因此通过在move闭包中写入vec_num,您尝试将vec_num移入闭包,但vec_num已被临时迭代器借用。最后,在闭包中,您通过引用迭代vec_num并返回迭代器,这意味着您正在尝试从函数返回对本地的引用。
标签: rust