Как использовать макрос для расширения кортежа до его членов в качестве аргументов функции? - PullRequest
2 голосов
/ 06 мая 2020

У меня есть функция из внешней библиотеки [1], например

fn set_color(r: f64, g: f64:, b: f64)

Я хотел бы управлять своими цветами в кортежах, например

let yellow = (1., 1., 0.);

Я подумал о таком макросе:

macro_rules! rgb {
    ( $rgb:expr ) => { rgb.0, rgb.1, rgb.2 }
}

игровая площадка

а затем

set_color(rgb!(yellow));

К сожалению, Rust тогда говорит: error: macro expansion ignores token ',' and any following.

Как можно Я заставил это случиться?


[1]: cairo::Context::set_source_rgb() и друзья

1 Ответ

3 голосов
/ 06 мая 2020

Вы не можете этого сделать. Макросы Rust - это не макросы C, выполняющие тупые текстовые манипуляции; Макросы Rust должны приводить к правильному коду Rust, а a, b, c недействителен.

Ближайшим из них будет передача функции макросу:

macro_rules! rgb {
    ($f:expr, $rgb:expr) => {
        $f($rgb.0, $rgb.1, $rgb.2)
    };
}
let white = (1., 1., 1.);
rgb!(set_color, white);
...