Rust宏调用报错,如何提取表达式内对象并分别使用?
问题分析与解决
错误原因
你的宏定义模式与实际调用语法不匹配:
- 宏规则中写的是
(($vector: expr).map(($closure: expr))),要求向量和闭包都被额外的括号包裹,但实际调用时是my_vector.map(|e| e * e),没有这些多余括号。 - 宏展开部分错误地使用了
$vector(),这会把向量当成函数调用,而实际上它是一个本地变量,直接用$vector即可。
修正后的代码
macro_rules! run_map { ($vector: expr.map($closure: expr)) => { $vector.iter().map($closure).collect::<Vec<_>>() }; } fn main() { let my_vector: Vec<i32> = vec![3,4,5]; let result = run_map!(my_vector.map(|e| e * e)); println!("{:?}", result); // 输出 [9, 16, 25] }
说明
- 宏模式调整为
$vector: expr.map($closure: expr),直接匹配变量.map(闭包)的语法,无需额外括号。 - 展开部分去掉
$vector后的括号,直接调用$vector.iter()遍历向量元素。 - 闭包
$closure直接传递给map方法,不需要重复标注类型。
内容的提问来源于stack exchange,提问作者tugaykansu
相关产品推荐
相关产品推荐

