Rust 为什么这个迭代器不能用作平面映射闭包的返回值?

Rust 为什么这个迭代器不能用作平面映射闭包的返回值?,rust,Rust,我认为这两种方法是等效的,但有一个错误。原因是什么?有更好的表达方式吗 pub fn create_pair()->(){ 让vec_num=vec![1,2,3]; 设vec_num2=&vec_num; 让所有=&vec_num .国际热核实验堆(iter) .flat|map(move | a | vec|num2.iter().map(move | b |[a,b])) 收集::(); println!(“{:?}”,全部); } [[1,1]、[1,2]、[1,3]、[2,1]、[2

我认为这两种方法是等效的,但有一个错误。原因是什么?有更好的表达方式吗

pub fn create_pair()->(){
让vec_num=vec![1,2,3];
设vec_num2=&vec_num;
让所有=&vec_num
.国际热核实验堆(iter)
.flat|map(move | a | vec|num2.iter().map(move | b |[a,b]))
收集::();
println!(“{:?}”,全部);
}
[[1,1]、[1,2]、[1,3]、[2,1]、[2,2]、[2,3]、[3,1]、[3,2]、[3,3]]
pub fn create_pair()->(){
让vec_num=vec![1,2,3];
让所有=&vec_num
.国际热核实验堆(iter)
.flat|map(move | a |和vec|u num.iter().map(move | b |[a,b]))
收集::();
println!(“{:?}”,全部);
}
错误[E0277]:`&std::iter::Map[closure@src/main.rs:5:48:5:63 a:]>`不是迭代器
|
=help:trait`std::iter::Iterator`未为`&std::iter::Map'实现[closure@src/main.rs:5:48:5:63 a:uquo;]>`
错误[E0599]:没有为struct`std::iter::FlatMap找到名为`collect`的方法[closure@src/main.rs:5:48:5:63 a:uz]>[closure@src/main.rs:5:19:5:64 vec_num:]>`在当前范围内
-->src/main.rs:6:10
|
收集::();
|在'std::iter::FlatMap'中找不到^[closure@src/main.rs:5:48:5:63 a:uz]>[closure@src/main.rs:5:19:5:64 vec\u num:\u00]>`
|
=注意:方法“collect”存在,但未满足以下特征界限:
`&std::iter::Map、&std::iter::Map、&std::iter::Map、&std::iter::Map根据,操作符的优先级低于方法调用。因此,这次结束:

move | a |&vec|u num.iter().map(move | b |[a,b])
将首先尝试计算
vec|num.iter().map(move | b |[a,b])
,然后引用该结果并返回它。这根本不等于你的第一个样品

我有一种预感,你的意思是:

move | a |(&vec|u num).iter().map(move | b |[a,b])
这也不起作用,但原因完全不同:

错误:捕获的变量无法转义`FnMut`闭包体
-->src/main.rs:17:28
|
14 |让vec_num=vec![1, 2, 3];
|----此处定义的变量
...
17.平面映射(move | a |(&vec|u num).iter().map(move | b |[a,b]))
|                          - ^^-------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|                          | | |
|| |此处捕获的变量
||返回对捕获变量的引用,该变量从闭包正文中逃逸
|推断为'FnMut'闭包
|
=注意:`FnMut`闭包在执行时只能访问其捕获的变量。。。
=注意:…因此,它们不能允许对捕获变量的引用转义
错误[E0505]:无法移出'vec_num',因为它是借用的
-->src/main.rs:17:19
|
15 |让所有=&vec_num
|----此处借用'vec_num'
16 |国际热核实验堆()
17.平面映射(move | a |(&vec|u num).iter().map(move | b |[a,b]))
|----------^^^^^^-----由于在闭包中使用而发生移动
|          |        |
||移出此处出现的'vec_num'
|借钱以后用来打电话
错误:由于之前的两个错误而中止
不能同时为方法调用借用
vec_num
,同时将其移动到闭包中。而且,由于闭包现在拥有
vec_num
,因此不能返回最终包含对
vec_num
的引用的值,因为一旦从闭包返回,它就会被删除

如果您拿走
移动
,则闭包将借用
向量
,而不是使用它

同样,根据锈蚀参考:

闭包可以捕获变量:

  • 通过引用:&T
  • 按可变引用:&mut T T
  • 按值:T
它们优先通过引用捕获变量,只有在 必需的

您不需要使用
&
来指示变量应该通过引用捕获。这项工作:

pub fn main()->(){
让vec_num=vec![1,2,3];
让所有=&vec_num
.国际热核实验堆(iter)
.flat|map(|a | vec|num.iter().map(move | b |[a,b]))
收集::();
println!(“{:?}”,全部);
}
根据,
&
运算符的优先级低于方法调用。因此,这次结束:

move | a |&vec|u num.iter().map(move | b |[a,b])
将首先尝试计算
vec|num.iter().map(move | b |[a,b])
,然后引用该结果并返回它。这根本不等于你的第一个样品

我有一种预感,你的意思是:

move | a |(&vec|u num).iter().map(move | b |[a,b])
这也不起作用,但原因完全不同:

错误:捕获的变量无法转义`FnMut`闭包体
-->src/main.rs:17:28
|
14 |让vec_num=vec![1, 2, 3];
|----此处定义的变量
...
17.平面映射(move | a |(&vec|u num).iter().map(move | b |[a,b]))
|                          - ^^-------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|                          | | |
|| |此处捕获的变量
||返回对捕获变量的引用,该变量从闭包正文中逃逸
|推断为'FnMut'闭包
|
=注意:`FnMut`闭包在执行时只能访问其捕获的变量。。。
=注意:…因此,它们不能允许对捕获变量的引用转义
错误[E0505]:无法移出'vec_num',因为它是借用的
-->src/main.rs:17:19
|
15 |让所有=&vec_num
|----此处借用'vec_num'