범위 모델의 제한 사항 : foreach over ranges는 현재 항목을 제공하지만 현재 색인은 제공하지 않습니다.
int i;
foreach(s; splitter("whatever")) {
// use s and i
i++;
}
: 가장 쉬운 수정 (열심히 결과를 저장하기 위해 새로운 배열을 할당하고 있음을 반환) 또는 단순히는 외부 변수에 자신을 계산 유지 std.string/std.array에서 분할을 사용하는 것입니다 스플리터에서 반환 된 범위는 어쨌든 인덱싱 될 수 없지만 ... splitter("whatever")[0]
은 컴파일되지 않습니다. 스플리터가 작동하는 방식은 필요할 때만 다음 분리 점을 찾으며 문자열을 스캔하는 작업을 포함하므로 한 번에 하나씩 처리 할 수 있습니다. 범위는 일반적으로 메서드 내에서 루프를 사용하는 것을 원하지 않으므로 속도 복잡성을 사용자가 쉽게 볼 수 있으므로 문자열을 스캔 할 때 루프가 필요합니다.
색인은 자동으로 보관 될 수 있지만 언어는 단순히 색인을 보관하지 않을 수 있습니다. 일부 사용자 지정 foreach는 작업으로, 당신이 정의 함수 호출이
int opApply(int delegate(int idx, string s) dg);
을, 당신은 foreach(i, s) {}
그리고 그것은 opApply 정의에서 그것을 알아낼 것입니다 수 있습니다. 제 인덱스 변수를 정의하는 범위 여지,없이 자동으로 삽입
for(auto f = range.front; !range.empty; range.popFront())
하지만 범위와,이 작업을 수행. 이것은 아마도 언젠가는 바뀔 수 있지만 정확히 어떻게 움직일 것인가는 공중에서 일어나고 공동체에서 특별한 돌진을 할 필요가 없다는 것입니다. 여러분 자신의 int 카운터 변수를 추가하는 것만으로도 충분하기 때문에이 제한은 그다지 진부하지 않을 것입니다 , 그것은 때때로 우리 중 몇 명을 귀찮게합니다. 앞으로