如何使用宏将元组扩展到其成员作为函数参数?

Joh*_*ler 5 macros rust

我有一个来自外部库 [1] 的函数,例如

fn set_color(r: f64, g: f64:, b: f64)
Run Code Online (Sandbox Code Playgroud)

我想在元组中管理我的颜色,例如

let yellow = (1., 1., 0.);
Run Code Online (Sandbox Code Playgroud)

我想到了一个像这样的宏:

macro_rules! rgb {
    ( $rgb:expr ) => { rgb.0, rgb.1, rgb.2 }
}
Run Code Online (Sandbox Code Playgroud)

操场

进而

set_color(rgb!(yellow));
Run Code Online (Sandbox Code Playgroud)

不幸的是,Rust 然后说:error: macro expansion ignores token ',' and any following

我怎样才能做到这一点?


[1]:cairo::Context::set_source_rgb()和朋友们

She*_*ter 8

你不可以做这个。Rust 宏不是执行愚蠢文本操作的 C 宏;Rust 宏必须产生有效的 Rust 代码,但它a, b, c是无效的。

最接近的是将函数传递给宏:

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