rust - 有没有办法将函数作为宏的参数传递?
问题描述
我正在尝试编写一个类似于g_signal_connect_swapped
gtk+ 的函数。
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)
解决方案
您可以使用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);
推荐阅读
- vaadin-grid - Vaadin 流:网格条件背景颜色
- julia - 在DifferentialEquations.jl中的n个回调之后是否有一种惯用的方法来终止集成
- javascript - Tempus-dominus 和 sweetalert2
- apache-flink - Flink,使用 Hadoop 兼容性时的奇怪行为
- ios - Xcode 一直显示:-1: SWIFT_VERSION '5.0' is unsupported, 支持的版本是:3.0, 4.0, 4.2。任何解决方案?
- pyspark - 为什么胶水 pyspark ETL 作业无法将新列添加到镶木地板表中?
- jenkins - 无论如何要从 sshPublisher 获得一些返回码或异常?
- python - 如何从 Windows PC 创建 Pygame dmg 文件?
- javascript - 如何让 Socket 只发送给请求的客户端?
- html - 我可以为“网格列”设置动画吗?