Можно ли расширить коллекцию до нескольких параметров функции - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть 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! или любую функцию / метод в этом отношении. Возможно ли это сделать?

1 Ответ

0 голосов
/ 02 сентября 2018

Нет. Макросы работают на деревьях синтаксиса и не могут деконструировать существующую переменную, подобную этой.

Однако использование макроса table! - не единственный способ создать prettytable::Table. Если вы посмотрите на документ, вы заметите, что есть реализация :

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...