【发布时间】:2022-09-25 12:26:57
【问题描述】:
目前我正在研究演员模型,我正在使用宏根据关键字构建不同的消息,例如actor msg和system msg。
workload 创建一个虚拟工作负载来模拟计算过程,它需要两个参数,payload: usize 和 op: OpCode(OperationType)。
create-actor 创建演员,两个参数是count: uszie 和name: String。
Workload 和 SystemCommand 可以转换为IntoTypedMessage。
#[macro_export]
macro_rules! build_msg {
($binary: expr, $arg1:tt, $arg2:expr) => {
{
let keyword: &str = $binary;
match keyword {
\"workload\" => {
let msg: TypedMessage = Workload::new($arg1 as usize, $arg2 as OpCode).into();
msg
}
\"create-actor\" => {
let name: &str = arg2;
let msg:TypedMessage = SystemCommand::CreateActor($arg1 as usize, $name.to_owned()).into();
msg
}
_ => {
panic!(\"Unknow Keyword, or number of vars not match with Keyword\");
}
}
}
};
}
但是,我收到一个错误:不匹配的类型
预期结构String,找到枚举messages::OpCode.
#[test]
fn macro_build_msg_test() {
let wl_macro_1: TypedMessage = build_msg!(\"workload\", 2, OpCode::AddOp); <- Problem here: OpCode::AddOp
assert_eq!(wl_macro_1, Workload::new(2, OpCode::AddOp).into());
}
基于keyword 和match,它应该进入不同的分支。所以应该将args转换为相应的类型。为什么我会收到此错误?我该如何解决?
标签: rust macros rust-macros