范围构建模式

标签 range d higher-order-functions construction

给定以下代码

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 采用默认参数。

也许我们还需要 std.traits 中的 arityMinarityMax

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

最佳答案

评估 currTime 三次:

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

计算 currTime 一次:

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

关于范围构建模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21954381/

相关文章:

D 命名约定 : How is Phobos organized?

Typescript:如何从返回函数的输入参数推断高阶函数中的泛型类型

c++ - 基于范围的语句定义冗余

python - 如何使用 Matplotlib 或 python 中的其他库设置轴间隔范围

d - D 中的元组与 TypeTuple

d - 如何在 DUB 项目中定义包的版本

javascript - 在这个更高级别的函数中,参数 n 来自哪里?

haskell - 如何使用映射/过滤器来实现这一点

python - SML 是否与 Python 的 range() 类似?

C# 如何根据多个范围索引生成新字符串