我希望能够将向量作为参数从向量数组提供给宏iproduct!,它接受不同数量的参数(所有参数必须是Iterator元素类型)。
最重要的是提供具有不同长度的数组的可能性。
这个方法好像叫“变参数函数”,好像还没有在Rust上实现。请大家把建设性的意见告诉我。谢谢!
这是我的想法,但不会如我所愿。
// main.rs
use itertools::iproduct;
fn main() {
let arr = [vec![1,2,3],vec![0,1,2]];
let mut result = Vec::new();
for tupl in iproduct!(arr) {
result.push(tupl);
};
println!("{:?}", result)
}
// current output: [[1, 2, 3], [0, 1, 2]]
// expected output: [[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],[3,1],[3,2]]
到目前为止,这工作得很好,但它是静态的,取决于参数的数量,而且只适用于字符串。我被迫写了几种不同的组合,仍然会涵盖一些情况。
use itertools::iproduct;
type TS2 = (String,String);
type TS3 = (String,String,String);
pub fn cartesian_2vec(l1: Vec<String>, l2: Vec<String>) -> Vec<TS2> {
let mut collector = Vec::new();
for tupl in iproduct!(l1,l2) {
collector.push(tupl);
};
collector
}
pub fn cartesian_3vec(l1: Vec<String>, l2: Vec<String>, l3: Vec<String>) -> Vec<TS3> {
let mut collector = Vec::new();
for tupl in iproduct!(l1,l2,l3) {
collector.push(tupl);
};
collector
}
fn main() {
let list1 = vec![String::from('1'),String::from('2'),String::from('3')];
let list2 = vec![String::from('a'),String::from('b')];
println!("{:?}", cartesian_2vec(list1,list2))
}
// [("1", "a"), ("1", "b"), ("2", "a"), ("2", "b"), ("3", "a"), ("3", "b")]
1条答案
按热度按时间3lxsmp7m1#
Rust中不存在变量函数,而是通常使用宏来建模:
或者更短的版本:
一个二个一个一个