【发布时间】:2016-12-12 03:49:51
【问题描述】:
我正在尝试创建宏,以便轻松创建自定义树类型的小实例。为此,我想将子节点指定为节点或整数(没有明确地将它们转换为 Node 类型)。 My attempt 在下面,因为 $x 的类型解析为 MDTree 失败,消息为 expected enum MDTree, found integral variable。
pub struct MultiNode {
children: Vec<MDTree>
}
impl MultiNode {
pub fn new(children: Vec<MDTree>) -> Box<MultiNode> {
return Box::new(MultiNode { children: children });
}
}
pub enum MDTree {
Single(u32),
Prime(Box<MultiNode>),
Degenerate(Box<MultiNode>),
}
macro_rules! mod_single {
($x:expr) => { MDTree::Single($x) }
}
macro_rules! mod_multi {
($($x:expr),*) => {{
let mut children: Vec<MDTree> = Vec::new();
$(
match $x {
0...4294967295 => { children.push(mod_single!($x)); }
_ => { children.push($x); }
}
)*
MultiNode::new(children)
}}
}
macro_rules! mod_prime {
($($x:expr),*) => { MDTree::Prime(mod_multi!($($x),*)) }
}
macro_rules! mod_degen {
($($x:expr),*) => { MDTree::Degenerate(mod_multi!($($x),*)) }
}
fn main() {
let md: MDTree = mod_prime!(0, mod_degen!(1,2));
}
有没有什么方法可以解决这个问题而不必写mod_prime!(mod_single(0), mod_degen!(mod_single(1),mod_single(2))) 或类似的东西?
【问题讨论】: