首页 > 解决方案 > 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上似乎找不到类似的东西所以我想问一下。非常感谢您对此提供任何帮助:)

标签: rustmacros

解决方案


您可以将$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, -=);

看它在操场上奔跑。


推荐阅读