Loops 如何将语句重复N次(简单循环)
我需要执行一个动作N次。D中最好的方法是什么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
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");});
}