Rust 锈蚀-与宏观规则有关的问题
我试图通过将类型强制转换为已执行的类型,然后按预期执行操作,来构建以下宏,该宏为各种类型执行add assign:Rust 锈蚀-与宏观规则有关的问题,rust,macros,Rust,Macros,我试图通过将类型强制转换为已执行的类型,然后按预期执行操作,来构建以下宏,该宏为各种类型执行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_a
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, -);
macro\u规则!为_值指定_{
($type\u to\u assign:ty、$cast\u to\u type:ty、$Add\u或\u Sub\u assign:ty、$Add\u或\u Sub\u assign:ty、$Add\u或\u Sub:tt)=>{
为ValueTerm执行$Add\u或\u Sub\u分配{
fn$add_或sub_assign(&mut self,rhs:$type_to_assign){
*self$add_或_sub=rhs as$cast_to_type;
}
}
};
}
为_值指定_!(i8,i64,AddAssign,add_assign,+);
为_值指定_!(i8,i64,SubAssign,sub_assign,-);
我想将其加倍作为所有操作类型的赋值,尽管我得到以下错误:
error: expected `::`, found keyword `for`:
impl $Add_or_Sub_Assign<$type_to_assign> for ValueTerm {
^^^ expected `::`
错误:应为“:”,找到“:”的关键字“:
为ValueTerm执行$Add\u或\u Sub\u分配{
^^^应为“”::`
这个错误很奇怪,对解释我做错了什么也没有任何帮助。在stackoverflow上似乎找不到类似的错误,所以我想我会问。非常感谢您在这方面的帮助:)您可以将
$Add\u或Sub\u Assign
和$Add\u或Sub\u 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, -=);
宏\u规则!为\u值指定\u{
($type_to_assign:ty,$cast_to_type:ty,$Add_或_Sub_assign:ident,$Add_或_Sub_assign:ident,$Add_或_Sub:tt)=>{
为ValueTerm执行$Add\u或\u Sub\u分配{
fn$add_或sub_assign(&mut self,rhs:$type_to_assign){
*自我$add_或_sub rhs作为$cast_添加到_类型;
}
}
};
}
为值赋值!(i8,i64,AddAssign,add_assign,+=);
为值赋值!(i8,i64,SubAssign,sub_assign,-=);
查看它在上运行。Rust宏不连接文本,它们在AST级别工作。一旦您请求将
SubAssign
解析为ty
,您就不能将
粘贴到它上使其成为另一种类型。类似地,$add\u或\u sub=
将无法工作,因为+=
是单个标记,而不是conca将+
令牌设置为=
令牌,但您已强制+
为其自己的令牌。啊,好的,我明白了,谢谢@mcarton信息:)谢谢@kmdreko:)