没有循环迭代器的枚举

Posted

技术标签:

【中文标题】没有循环迭代器的枚举【英文标题】:Enumeration Without Loop Iterator 【发布时间】:2014-04-04 21:20:02 【问题描述】:

在 ruby​​ 中,我看到了以下内容。

10.times  
    # do this block 10 times

有了这个,(据我所知,这与 ruby​​ 无关)没有循环迭代器。在基于 C 的语言中,我能想到的最接近的副本是一个简单的 for 循环。

for (int i = 0; i < 10; i++) 
    // do this block 10 times

但这利用了循环迭代器i。在基于 C 的语言(包括标签中列出的语言)中是否有任何方法可以在不使用迭代器的情况下多次执行代码块? 例如:如果我想执行一个块一定次数,但不关心我在哪个迭代。

【问题讨论】:

你误解了“迭代器”这个词的意思。 您可以使用宏在预处理时将任何代码重复任意次数。 有时需要这样做,所以我记得 Boost 预处理器库提供了这个功能。但你为什么想要它? #define TIMES(n) for(int _i=0;_i&lt;(n);++_i) #define NTimes(N) for (uint32_t __ntimes_i = 0; __ntimes_i &lt; N; __ntimes_i++)#define DO(BLOCK) BLOCKNTimes(5) DO(/// stuff) 在这种情况下, i 实际上是一个迭代计数器。你需要柜台,这样你就知道什么时候完成了。 【参考方案1】:

不,这是不可能的。 i 存在是因为您需要跟踪执行了多少次迭代。甚至 Ruby 也必须在后台执行此操作,否则它怎么知道已经执行了多少次迭代?

实际上只是语法上的不同。 Ruby 将它隐藏起来,而 C 衍生品则没有。

【讨论】:

【参考方案2】:

在 Ruby 中,所有类型(包括整数)本质上都是复杂类型,而在其他语言中,整数是普通的旧原始类型很常见。例如,在 C# 中,尽管我认为我不想这样做,但如果目标纯粹是模仿 Ruby 语法,那么......

int上定义扩展方法

public static class Helpers

    public static void Times(this int value, Action action)
    
        for (int i = 0; i < value; i++)
        
            action.Invoke();
        
    

做点什么……

10.Times(() =>  ... );

【讨论】:

以上是关于没有循环迭代器的枚举的主要内容,如果未能解决你的问题,请参考以下文章

for循环增强for循环和迭代器的区别

枚举器和迭代器

foreach 循环是不是从字面上重写为带有迭代器的 for 循环? [复制]

C#中的枚举器和迭代器

带有int迭代器的Python循环[重复]

可迭代对象和迭代器的区别