fn main() {
let b = StructB;
rust_by_example::TraitA::hi(&b);
let c = StructC;
rust_by_example::TraitA::hi(&c);
println!("TraitA path: {}",std::any::type_name::<TraitA>());
}
fn main() {
let b = StructB;
rust_by_example::TraitA::hi(&b);
let c = StructC;
rust_by_example::TraitA::hi(&c);
println!("TraitA path: {}",std::any::type_name::<TraitA>());
}
评论区
写评论这种问题其实比较像http server的路由嘛
有routerify,这种靠builder-pattern,运行时手动把路径(
String
)和handler绑起来的,内部实现我估计是棵树或者编译成了正则。简单一点的话,用一个Hashmap也行。也有serenity,这种其实是builder-pattern,但是靠过程宏生成了绑定代码的东西。
--
👇
chinagxwei: 对,想通过这种方式达到自动调用效果,以此实现简单的rpc流程。
--
👇
johnmave126:
std::any::type_name::<TraitA>()
是一个运行时的值,宏是编译期的,并做不到这个。不如说一下你到底有个什么use case,是想做反射吗,还是rpc什么的?
如果是比如rpc,可以编译期/运行时初始化的时候把字符串和对应的调用绑起来(HashMap之类的),然后就跟路由一样你去检索这个表然后去调用。
对,想通过这种方式达到自动调用效果,以此实现简单的rpc流程。
--
👇
johnmave126:
std::any::type_name::<TraitA>()
是一个运行时的值,宏是编译期的,并做不到这个。不如说一下你到底有个什么use case,是想做反射吗,还是rpc什么的?
如果是比如rpc,可以编译期/运行时初始化的时候把字符串和对应的调用绑起来(HashMap之类的),然后就跟路由一样你去检索这个表然后去调用。
std::any::type_name::<TraitA>()
是一个运行时的值,宏是编译期的,并做不到这个。不如说一下你到底有个什么use case,是想做反射吗,还是rpc什么的?
如果是比如rpc,可以编译期/运行时初始化的时候把字符串和对应的调用绑起来(HashMap之类的),然后就跟路由一样你去检索这个表然后去调用。
--
👇
chinagxwei: lib.rs
main.rs
我想动态获取trait的路径后动态调用实例方法(路径:rust_by_example::TraitA,方法:hi)。
但是获取路径表达式的字符串后就不懂要如何将字符转成表达式传入到宏当中将字符串解析为表达式,过程宏当中通过将表达式的字符串转换为TokenStream后再解析为表达式对象。但是我不懂声明宏中要如何实现。
--
👇
johnmave126: 感觉是个XY problem,不如先说一说你为什么要这么做,究竟要达成一个什么目的 简短来说,不用过程宏不太行
lib.rs
main.rs
我想动态获取trait的路径后动态调用实例方法(路径:rust_by_example::TraitA,方法:hi)。
但是获取路径表达式的字符串后就不懂要如何将字符转成表达式传入到宏当中将字符串解析为表达式,过程宏当中通过将表达式的字符串转换为TokenStream后再解析为表达式对象。但是我不懂声明宏中要如何实现。
--
👇
johnmave126: 感觉是个XY problem,不如先说一说你为什么要这么做,究竟要达成一个什么目的 简短来说,不用过程宏不太行
老版本nom好像就是这样子的
感觉是个XY problem,不如先说一说你为什么要这么做,究竟要达成一个什么目的 简短来说,不用过程宏不太行