Rust - 宏规则问题
Rust - Issue with macro rules
我正在尝试构建以下宏,通过将类型转换为已经实现的类型然后按预期执行操作来为各种类型实现添加分配:
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 `::`
这个错误很奇怪,对解释我做错了什么没有任何帮助。似乎无法在 Whosebug 上找到与此类似的内容,所以我想问一下。非常感谢对此的任何帮助:)
您可以使 $Add_or_Sub_Assign
和 $add_or_sub_assign
成为 标识符 (:ident
)。这样它们就可以分别用作类型和方法名称的 part(后者从来不是类型开头)。您将需要按照评论中提到的内容进行操作,并使 +=
成为单个令牌,而不是尝试拆分它。
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, -=);
在 playground 上查看 运行。
我正在尝试构建以下宏,通过将类型转换为已经实现的类型然后按预期执行操作来为各种类型实现添加分配:
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 `::`
这个错误很奇怪,对解释我做错了什么没有任何帮助。似乎无法在 Whosebug 上找到与此类似的内容,所以我想问一下。非常感谢对此的任何帮助:)
您可以使 $Add_or_Sub_Assign
和 $add_or_sub_assign
成为 标识符 (:ident
)。这样它们就可以分别用作类型和方法名称的 part(后者从来不是类型开头)。您将需要按照评论中提到的内容进行操作,并使 +=
成为单个令牌,而不是尝试拆分它。
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, -=);
在 playground 上查看 运行。