Rust-宏规则问题



我正试图构建以下宏,通过将类型强制转换为已执行的类型,然后按预期执行操作,为各种类型执行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上似乎找不到类似的东西,所以我想问一下。非常感谢在这方面的任何帮助:(

您可以将$Add_or_Sub_Assign$add_or_sub_assign设置为标识符(:ident(。这样,它们可以分别用作类型和方法名称的部分(后者从一开始就不是类型(。您需要遵循评论中提到的内容,并将+=作为一个单独的令牌,而不是试图拆分它。

macro_rules! assign_for_value {
( $type_to_assign:ty, $cast_to_type:ty, $Add_or_Sub_Assign:ident, $add_or_sub_assign:ident, $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, -=);

看到它在操场上奔跑。

最新更新