rust - 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, -=);
看它在操场上奔跑。
推荐阅读
- java - Spring ProxyFactoryBean - 有时不调用/丢失拦截器/建议
- sql - 合并列时去掉不必要的空格
- angular - 使配置文件在 staging\prod 环境中可编辑
- javascript - 在 Node Js 中处理动态数量的 Promise
- python - Pandas中爆炸的动态版本?
- javascript - 解构不可迭代实例的无效尝试
- vba - VB中的重复搜索(Word)
- javascript - PDF javascript突出显示过期日期
- java - 在spring boot中将@Value注入@PropertySource
- java - 如何将弹性搜索查询更改为 Java API?