Macros 如何获取宏重复单个元素的索引

Macros 如何获取宏重复单个元素的索引,macros,rust,Macros,Rust,我需要获取宏重复元素的索引才能编写下一个代码: 我知道一种方法:告诉用户手动编写索引: 但是有没有一种更优雅的方法不需要用户的操作呢?最简单的方法是使用递归,如下所示: 结构A{ 数据:[i32;3] } 宏规则!tst{ (@step$_idx:expr,)=>{}; (@step$idx:expr,$head:ident,$($tail:ident,)*)=>{ 暗示{ fn$head和self)->i32{ self.data[$idx] } } tst!(@step$idx+1usi

我需要获取宏重复元素的索引才能编写下一个代码:

我知道一种方法:告诉用户手动编写索引:


但是有没有一种更优雅的方法不需要用户的操作呢?

最简单的方法是使用递归,如下所示:

结构A{ 数据:[i32;3] } 宏规则!tst{ (@step$_idx:expr,)=>{}; (@step$idx:expr,$head:ident,$($tail:ident,)*)=>{ 暗示{ fn$head和self)->i32{ self.data[$idx] } } tst!(@step$idx+1usize,$($tail,)*); }; ($($n:ident),*)=>{ tst!(@step 0usize,$($n,)*); } } tst!(一、二、三); fn main(){ 设a=a{data:[10,20,30]}; println!(“{:?}”,(a.one(),a.two(),a.three()); } 注意,我将方法改为采用
&self
,而不是
self
,因为这样可以更容易地在
main
函数中编写示例


递归中的每一步只向索引中添加1。使用“类型化”整数文本是一个好主意,以避免由于大量整数推断而导致编译速度减慢。

Wow。令人惊叹的。这让我大吃一惊。锈仍然让我惊讶:)非常感谢,这是一个非常有趣的解决方案!你正在做的事情听起来很可能是个坏主意。在可行的情况下,你应该支持其他设计;e、 g.制作一个
结构a{one:i32,two:i32,three:i32}
@ChrisMorgan。事实上,它涉及到像四元数这样的向量的实现,其中每种类型都有不同的长度,并且需要不同的访问器。我认为,如果我对所有代码都使用一个代码,就可以简化工作。你为什么认为这是个坏主意?我不明白你到底想用这个来达到什么目的。你能分享一个完整的代码示例吗?@ChrisMorgan,好吧,现在它只是一个概念,所以不存在我可以分享的真正代码。当(或如果)我按照我要求的方式写的时候,我可以在完成后分享。
struct A {
    data: [i32; 3]
}

macro_rules! tst {
    ( $( $n:ident ),* ) => {
        impl A {
            $(
                fn $n(self) -> i32 {
                    self.data[?] // here I need the index
                }
            ),*
        }
    }
}
( $( $i:ident => $n:ident ),* )