2014-01-20 3 views
1
import std.stdio, std.string, std.conv, std.array; 
int main(){ 
foreach(int i,s; splitter("Hello world !")){ 
    writeln(i); 
    }; 
    return 0; 
} 

안녕하세요! 배열과 문자열에 문자열 인덱스를 가져오고 싶습니다. 왜이 오류가 발생합니까?배열을 문자열로 반복

dmd main.d 
Error: cannot infer argument types 
make: *** [c] Error 1 

답변

1

범위 모델의 제한 사항 : 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 카운터 변수를 추가하는 것만으로도 충분하기 때문에이 제한은 그다지 진부하지 않을 것입니다 , 그것은 때때로 우리 중 몇 명을 귀찮게합니다. 앞으로