我有以下锈蚀代码
use std::any::Any;
use std::rc::Rc;
fn main() {
let mut variables = Vec::<Rc<dyn Any>>::new();
variables.push(Rc::new(1_i32));
variables.push(Rc::new(false));
variables.push(Rc::new(4.53_f64));
let integer: i32 = *variables[0].clone().downcast::<i32>().unwrap();
let boolean: bool = *variables[1].clone().downcast::<bool>().unwrap();
let floating: f64 = *variables[2].clone().downcast::<f64>().unwrap();
let my_goal: (i32, bool, f64) = (integer, boolean, floating)
println!("{:?}", my_goal);
我想使用宏来实现自动化。(我知道这不是最理想的,但这只是一个 MWE 来询问有关宏的问题)
特别是我想创建一个向下转换Any
为给定类型的元组
我的第一次尝试是:
macro_rules! my_macro {
($vector:ident; $($type:ty),*) => {
// ($($type),*)
//println!("{:?}", $vector);
//$(println!("{:?}", stringify!($type));)*
let idx = 0;
($(
*$vector[0].clone().downcast::<$type>().unwrap()
),*)
};
}
这是错误的,因为0
硬编码。我尝试了几种方法来声明一个变量并沿着宏增加它,但都失败了。我该怎么办?
我很确定您没有声明变量,因为您只使用了一组花括号,而实际上在粗箭头后的宏中需要两个花括号。
我想这就是你想要的宏:
你可以像这样使用它:
输出结果如下:
或者,如果您确实想使用索引来访问元素: