수색…


비고

컴파일러가 foreach를 발견하면

foreach (element; range) {

다음과 같이 내부적으로 다시 작성됩니다.

for (auto it = range; !it.empty; it.popFront()) {
    auto element = it.front;
    ...
}

위의 인터페이스를 수행하는 모든 객체를 입력 범위라고하며 따라서 반복 할 수있는 유형입니다.

struct InputRange {
    @property bool empty();
    @property T front();
    void popFront();
}

문자열과 배열은 범위입니다.

import std.stdio;

void main() {
    auto s = "hello world";
    auto a = [1, 2, 3, 4];

    foreach (c; s) {
        write(c, "!"); // h!e!l!l!o! !w!o!r!l!d!
    }
    writeln();

    foreach (x; a) {
        write(x * x, ", "); // 1, 4, 9, 16, 
    }
}

새로운 입력 범위 유형 만들기

InputRange 개념은 다음과 같은 세 가지 기능을 가지고 있습니다.

struct InputRange(T) {
    @property bool empty();
    @property T front();
    void popFront();
}

요컨대,

  1. 범위가 비어 있는지 확인하십시오.
  2. 현재 요소를 얻는다.
  3. 다음 요소로 이동

우리 자신의 타입을 InputRange 만들기 위해서는이 세가지 함수를 구현해야한다. 무한한 사각형 시퀀스를 살펴 보겠습니다.

struct SquaresRange {
    int cur = 1;

    @property bool empty() {
        return false;
    }

    @property int front() {
        return cur^^2;
    }

    void popFront() {
        cur++;
    }
}

피보나치의 예를 보려면 D 둘러 보기를 참조하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow