Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 锈蚀-与宏观规则有关的问题_Rust_Macros - Fatal编程技术网

Rust 锈蚀-与宏观规则有关的问题

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

我试图通过将类型强制转换为已执行的类型,然后按预期执行操作,来构建以下宏,该宏为各种类型执行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, -);
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:)