我正在寻找具有签名fn product(vector: &Vec<i32>, n: &i32) -> Vec<Vec<i32>>
或类似功能的函数。一个例子:
assert_eq!(
product(vec![1, 2, 3, 4], 2),
[
[1, 1],
[1, 2],
[1, 3],
[1, 4],
[2, 1],
[2, 2],
[2, 3],
[2, 4],
[3, 1],
[3, 2],
[3, 3],
[3, 4],
[4, 1],
[4, 2],
[4, 3],
[4, 4]
],
)
我已经尝试使用iproduct
从itertools
箱:
use itertools::iproduct; // 0.10.0
fn product(vector: &Vec<i32>, n: &i32) -> Vec<Vec<i32>> {
let mut result = Vec::new();
for _ in 0..*n {
result = iproduct!(result.iter(), vector.iter()).collect();
}
result
}
产生以下错误:
error[E0277]: a value of type `Vec<_>` cannot be built from an iterator over elements of type `(&_, &i32)`
--> src/lib.rs:7:58
|
7 | result = iproduct!(result.iter(), vector.iter()).collect();
| ^^^^^^^ value of type `Vec<_>` cannot be built from `std::iter::Iterator<Item=(&_, &i32)>`
|
= help: the trait `FromIterator<(&_, &i32)>` is not implemented for `Vec<_>`
如何解决这个问题?
-
您究竟期望
result
是什么类型?如果它是返回值,它必须是Vec<Vec<i32>>
,对吗?但随后iproduct!(result.iter(), vector.iter())
返回Iterator<Item = (&Vec<i32>, &i32)>
(通过显式指定result
的类型可以看到),并将Vec<(&Vec<i32>, &i32)>
分配给result
,这是行不通的。因此,您需要先将map
和(&Vec<i32>, &i32)
转换为Vec<i32>
。 -
开始时,
result
是空的,所以它与任何东西的乘积都是空的。它需要包含一个元素。这个元素应该是什么? -
参考
n
没有什么意义;类似地,更倾向于接受&[i32]
片而不是&Vec<i32>
如果你修复了所有这些,你得到
S
o
m
e
s
p
o
i
l
e
r
s
p
a
c
e
f
o
r
y
o
u
t
o
t
r
y
y
o
u
r
s
e
l
f
游乐场
use itertools::iproduct;
fn product(vector: &[i32], n: i32) -> Vec<Vec<i32>> {
let mut result: Vec<Vec<i32>> = vec![vec![]];
for _ in 0..n {
result = iproduct!(result.iter(), vector.iter())
.map(|(v, x)| {
let mut v1 = v.clone();
v1.push(*x);
v1
})
.collect();
}
result
}
我会用flat_map
而不是自己用iproduct
。