有没有办法将函数作为宏的参数传递?
Is there a way to pass a function as a parameter of a macro?
我正在尝试在 gtk+ 中编写类似于 g_signal_connect_swapped
的函数。
macro_rules! connect_clicked_swap {
($widget: tt,$other_widget: expr,$function: ident) => {
$widget.connect_clicked(|widget| $function($other_widget))
};
}
ident
在这里不起作用,因为我想将完整路径传递给 function.eg。 gtk::ApplicationWindow::close。所以我可以做类似 connect_clicked_swap!(button, &window, gtk::ApplicationWindow::close)
的事情
您可以使用 path
而不是 ident
来指定路径。但最灵活的方法是使用 expr
,它可以接受路径,也可以接受 return 函数的表达式,包括闭包。
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);
我正在尝试在 gtk+ 中编写类似于 g_signal_connect_swapped
的函数。
macro_rules! connect_clicked_swap {
($widget: tt,$other_widget: expr,$function: ident) => {
$widget.connect_clicked(|widget| $function($other_widget))
};
}
ident
在这里不起作用,因为我想将完整路径传递给 function.eg。 gtk::ApplicationWindow::close。所以我可以做类似 connect_clicked_swap!(button, &window, gtk::ApplicationWindow::close)
您可以使用 path
而不是 ident
来指定路径。但最灵活的方法是使用 expr
,它可以接受路径,也可以接受 return 函数的表达式,包括闭包。
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);