Loops 如何将语句重复N次(简单循环)

Loops 如何将语句重复N次(简单循环),loops,d,Loops,D,我需要执行一个动作N次。D中最好的方法是什么 for(uint i=0; i<N; i++) action(); foreach(uint i; 0.. N) action(); 可能吗?可能是这样的吗 void loop(int n, void delegate() func) { foreach (i; 0 .. n) { func(); } } 用法: loop(10, { writeln("Hello

我需要执行一个动作N次。D中最好的方法是什么

for(uint i=0; i<N; i++)
   action();

foreach(uint i; 0.. N)
   action();

可能吗?

可能是这样的吗

void loop(int n, void delegate() func)
{
    foreach (i; 0 .. n)
    {
        func();
    }
}
用法:

loop(10, {        
    writeln("Hello World!");
});
是的,这是可能的

import std.stdio;
import std.traits;

void foo()
{
    writeln("Do It!");
}

void times(T,N)(N n, T action) if (isCallable!T && isIntegral!N)
{
    static if (ParameterTypeTuple!action.length == 1 
           && isIntegral!(ParameterTypeTuple!action[0]))
        foreach (i; 0 .. n)
            action(i);
    else
        foreach (i; 0 .. n)
            action();
}

void main(string[] args)
{
    10.times(&foo);
    10.times({writeln("Do It!");});
    10.times((uint n){writeln(n + 1, " Round");});
}
带参数的版本支持:

import std.stdio;
import std.traits;

void foo()
{
    writeln("Do It!");
}

struct Step {
    alias n this;
    size_t n;
    this(size_t i)
    {
        n = i + 1;
    }
}

struct Index {
    alias n this;
    size_t n;
}

void times(T,N,A...)(N n, T action, A args) if (isCallable!T && isIntegral!N)
{
    alias PTTAction = ParameterTypeTuple!action;
    static if (PTTAction.length >= 1)
    {
        alias FP = PTTAction[0];
        static if (is(Index == FP) || is(Step == FP))
            foreach (i; 0 .. n)
                action(FP(i), args);
        else
            action(args);
    }
    else
        foreach (i; 0 .. n)
            action();
}

void main(string[] args)
{
    10.times(&foo);
    10.times({writeln("Do It!");});
    10.times((Step n){writeln(n, " Step");});
    10.times((Index n, string msg){writeln(n, msg);}, " Index");
    stdin.readln;
}
更新:

为了获得更好的性能,您可以使用alias template Parameter执行以下操作:

void times(alias action,N)(N n) if (isCallable!action && isIntegral!N)
{
    static if (ParameterTypeTuple!action.length == 1 
           && isIntegral!(ParameterTypeTuple!action[0]))
        foreach (i; 0 .. n)
            action(i);
    else
        foreach (i; 0 .. n)
            action();
}

void main(string[] args)
{
    10.times!(foo);
    10.times!({writeln("Do It!");});
    10.times!((uint n){writeln(n + 1, " Round");});
}

顺便说一句,您的第二个示例必须使用
foreach
而不是
for
,并且您实际上可以删除
uint
。D for循环迭代器中使用的一个约定是将循环迭代器命名为
\uuuu
。因此它变成了foreach(;0..N)我真的建议下载免费参考并阅读它。所有这些在书中很早就得到了回答。你的第一个作品。你的第二个是0..N{…}中的uu。第三个是可能的,但我不确定时间延长是否正常。我知道WWDC演示文稿中有一个例子,我想是介绍性的Swift。好的,谢谢:-)特别是第一个版本非常简单,我喜欢它。因为按名称传递(别名操作)不需要取消引用操作。但我不确定。也许还有更多的原因,所以这将是一个相互交织的问题,让这成为一个单独的问题。
void times(alias action,N)(N n) if (isCallable!action && isIntegral!N)
{
    static if (ParameterTypeTuple!action.length == 1 
           && isIntegral!(ParameterTypeTuple!action[0]))
        foreach (i; 0 .. n)
            action(i);
    else
        foreach (i; 0 .. n)
            action();
}

void main(string[] args)
{
    10.times!(foo);
    10.times!({writeln("Do It!");});
    10.times!((uint n){writeln(n + 1, " Round");});
}