首页 > 解决方案 > 有没有办法将函数作为宏的参数传递?

问题描述

我正在尝试编写一个类似于g_signal_connect_swappedgtk+ 的函数。

macro_rules! connect_clicked_swap {
    ($widget: tt,$other_widget: expr,$function: ident) => {
        $widget.connect_clicked(|widget| $function($other_widget))
    };
}

ident在这里不起作用,因为我想将完整路径传递给函数。例如。gtk::ApplicationWindow::关闭。所以我可以做类似的事情connect_clicked_swap!(button, &window, gtk::ApplicationWindow::close)

标签: rustgtkrust-decl-macros

解决方案


您可以使用path而不是ident为了指定路径。但最灵活的是使用expr,它可以接受路径,也可以接受返回函数的表达式,包括闭包。

macro_rules! connect_clicked_swap {
    ($widget: tt, $other_widget: expr, $function: expr) => {
        $widget.connect_clicked(|widget| $function($other_widget))
    };
}
connect_clicked_swap!(widget1, widget2, path::to::function);
connect_clicked_swap!(widget1, widget2, |widget| println!("widget = {}", widget);

推荐阅读