【发布时间】:2021-04-29 15:53:38
【问题描述】:
我正在尝试构建以下宏,通过将类型转换为已实现的类型然后按预期执行操作,为各种类型实现 add-assign:
macro_rules! assign_for_value {
( $type_to_assign:ty, $cast_to_type:ty, $Add_or_Sub_Assign:ty, $add_or_sub_assign:ty, $add_or_sub:tt ) => {
impl $Add_or_Sub_Assign<$type_to_assign> for ValueTerm {
fn $add_or_sub_assign(&mut self, rhs: $type_to_assign) {
*self $add_or_sub= rhs as $cast_to_type;
}
}
};
}
assign_for_value!(i8, i64, AddAssign, add_assign, +);
assign_for_value!(i8, i64, SubAssign, sub_assign, -);
我想将它加倍作为所有操作类型的分配,尽管我收到以下错误:
error: expected `::`, found keyword `for`:
impl $Add_or_Sub_Assign<$type_to_assign> for ValueTerm {
^^^ expected `::`
这个错误很奇怪,对解释我做错了什么没有任何帮助。在stackoverflow上似乎找不到类似的东西所以我想问一下。非常感谢您对此提供任何帮助:)
【问题讨论】:
-
Rust 宏不连接文本,它们在 AST 级别上工作。一旦您请求将
SubAssign解析为ty,您就不能将<T>粘贴到它上面以使其成为另一种类型。同样,$add_or_sub=将不起作用,因为+=是单个令牌,而不是+令牌与=令牌的串联,但您已强制+成为它自己的令牌。 -
啊好的,我明白了,谢谢@mcarton 的信息 :)