rust 元组、数组或向量的向量作为参数:瓦里亚季

jjjwad0x  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(143)

我希望能够将向量作为参数从向量数组提供给宏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")]
3lxsmp7m

3lxsmp7m1#

Rust中不存在变量函数,而是通常使用宏来建模:

use itertools::iproduct;

macro_rules! cartesian_vecs {
    ($($l:expr),+) => {{
        let mut collector = Vec::new();
        for tupl in iproduct!($($l),+) {
            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_vecs!(list1, list2));
}
[("1", "a"), ("1", "b"), ("2", "a"), ("2", "b"), ("3", "a"), ("3", "b")]

或者更短的版本:
一个二个一个一个

相关问题