【问题标题】:Range Construction Pattern范围构造模式
【发布时间】:2014-03-24 03:29:11
【问题描述】:

给定以下代码

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 in

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

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

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

也许我们在std.traits 中也需要arityMinarityMax

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

【问题讨论】:

  • 是的。最好测试能力而不是属性。这样,您的代码将更加通用,并且可以与例如函子。

标签: range d higher-order-functions construction


【解决方案1】:

三次评估currTime

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

评估一次currTime

auto times = Clock.currTime.repeat(3).array();

【讨论】:

  • 好的。伟大的。请参阅上面的后续问题。
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多