2

给定以下代码

import std.datetime: Clock, SysTime, Duration;
SysTime[] times;
const n = 3;
foreach (i; 0..n) times ~= Clock.currTime;

是否有更简单、可能更实用、更高阶的模式来实现相同的目标?

一个好处是,如果可能的话,可能通过一些就地构造模式来最小化元素的复制。

另见:http: //forum.dlang.org/thread/yofbijaejfyftpcjdcvd@forum.dlang.org#post-yofbijaejfyftpcjdcvd :40forum.dlang.org

更新

好的,到目前为止,这是我的尝试:

enum arityMin0(alias fun) = __traits(compiles, fun());

auto apply(alias fun, N)(N n) if (isCallable!fun &&
                                  arityMin0!fun &&
                                  !is(ReturnType!fun == void) &&
                                  isIntegral!N)
{
    import std.range: iota, map;
    return n.iota.map!(n => fun);
}

例如,称为

import std.datetime: Clock;
auto times = 3.apply!(Clock.currTime).array;

还剩一个细节。限制

arity!fun == 0

评估false

auto times = 3.apply!(Clock.currTime).array;

因为这里的 arity 实际上是 0 和 1。

所以在这种情况下arity!fun评估为1,因为Clock.currTime采用默认参数。

也许我们arityMin也需要arityMaxstd.traits

在那种情况下我应该使用__traits(compiles来实现arityMin吗?

4

1 回答 1

6

currTime三次评价:

auto times = 3.iota.map!(n => Clock.currTime).array();

评估currTime一次:

auto times = Clock.currTime.repeat(3).array();
于 2014-02-22T12:35:46.603 回答