Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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_Rust Macros_Rust Decl Macros - Fatal编程技术网

Rust 宏中的元组索引

Rust 宏中的元组索引,rust,rust-macros,rust-decl-macros,Rust,Rust Macros,Rust Decl Macros,我试图在宏中索引数据元组,该宏为trait实现生成签名,但有一些错误。我可以索引元组还是需要其他解决方案?用我在谷歌找到的tuple\u索引进行黑客攻击,但它对我不起作用 我可以索引元组还是需要其他解决方案 不可以。表达式$idx+1将生成不同的标记,例如0,+,1,并且无法将其计算为声明性宏中的单个文字标记。您的代码没有给出任何错误。您可能希望在函数中使用该宏。请提供一个例子,我们可以重现您在代码中遇到的错误,例如,顺便说一句:您的代码有效。。。你可能想更具体地说明什么有效,什么无效。这就是

我试图在宏中索引数据元组,该宏为trait实现生成签名,但有一些错误。我可以索引元组还是需要其他解决方案?用我在谷歌找到的
tuple\u索引进行黑客攻击,但它对我不起作用

我可以索引元组还是需要其他解决方案


不可以。表达式
$idx+1
将生成不同的标记,例如
0
+
1
,并且无法将其计算为声明性宏中的单个文字标记。

您的代码没有给出任何错误。您可能希望在函数中使用该宏。请提供一个例子,我们可以重现您在代码中遇到的错误,例如,顺便说一句:您的代码有效。。。你可能想更具体地说明什么有效,什么无效。这就是为什么提供一个完全有效/无效的示例很重要。只有在那种情况下我们才能帮忙you@hellow需要调用gen_packer,而不是tuple_index。我正在更新code@AlexanderKudzin什么是
A
?@hellow字母表示泛型(非变量)
macro_rules! expr { ($x:expr) => ($x) } // HACK
macro_rules! tuple_index {
    ($tuple:expr, $idx:tt) => { expr!($tuple.$idx) }
}
macro_rules! gen_packer {
    (@step $data: expr, $_idx:expr,) => {};

    (@step $data: expr, $idx:expr, $T:ident, $($tail:ident,)*) => {
        // out.append(&mut $T::pack(tuple_index!(data,$idx)));
        tuple_index!($data, $idx);

        gen_packer!(@step $data, $idx + 1, $($tail,)*);
    };

    ($($T:ident),*) => {
        impl<$($T,)+> Packer<($($T,)+)> for Iproto
        where $($T: Pack<$T>,)+
        {
            fn pack(self, data: ($($T,)+)) -> Vec<u8> {
                let mut out = vec![];
                gen_packer!(@step data, 0, $($T,)*);
                return out
            }
        }
    }
}

gen_packer!(A);