2014-02-22 2 views
2

는 같은 목표를 달성하기 위해 와 간단한 아마도 기능, 고차 패턴이 다음 코드범위 건축 패턴

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

을 감안할 때?

가능한 경우 보너스는 일부 내부 편집 패턴을 통해 요소의 복사를 최소화하는 것이 좋습니다.

은 참조 : http://forum.dlang.org/thread/[email protected]#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; 

한 세부 . 인수에 대응 실제로 여기 중 하나를 0과 1이기 때문에 제한

arity!fun == 0 

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

false로 평가.

따라서 Clock.currTime이 기본값 인수를 취하기 때문에 은이 경우에 1으로 평가됩니다.

어쩌면 arityMinarityMaxstd.traits에도 필요합니다.

을 사용하여 arityMin을 구현해야합니까?

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

currTime 평가 :

+0

예. 속성보다는 기능을 테스트하는 것이 좋습니다. 이렇게하면 코드가보다 일반화되고 예를 들어 다음과 같이 작동합니다. 펑터. –

답변

6

currTime 세 번 평가

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

확인. 큰. 위의 후속 질문을 참조하십시오. –