是否可以将集合扩展为函数的多个参数

问题描述 投票:0回答:1

我有一个Vec有以下元素:

let v = vec!(["ABC", "DEFG", "HIJKLMN"],
             ["foobar", "bar", "foo"],
             ["foobar2", "bar2", "foo2"])

我正在使用库table!中的宏prettytable-rs,它接受如下参数:

let table = table!(["ABC", "DEFG", "HIJKLMN"],
                   ["foobar", "bar", "foo"],
                   ["foobar2", "bar2", "foo2"]);

table.printstd();

基本上我想爆炸Vec v并将其元素作为多个参数传递给宏table!或任何函数/方法。有可能这样做吗?

vector parameters rust
1个回答
2
投票

不可以。宏在语法树上工作,不能像这样解构现有的变量。

但是,使用table!宏并不是构建prettytable::Table的唯一方法。如果你看一下doc,你会注意到有an implementation of

impl<T, A, B> From<T> for Table where
    B: ToString,
    A: IntoIterator<Item = B>,
    T: IntoIterator<Item = A>, 

这意味着你可以从任何可迭代的东西构造一个表,产生一些实现ToString的东西。

这允许构造这样的表:

#[macro_use]
extern crate prettytable;
use prettytable::Table;

fn main() {
    let v = vec![
        ["ABC", "DEFG", "HIJKLMN"],
        ["foobar", "bar", "foo"],
        ["foobar2", "bar2", "foo2"],
    ];

    let table = prettytable::Table::from(v.iter());

    // Print the table to stdout
    table.printstd();
}
© www.soinside.com 2019 - 2024. All rights reserved.