2013-11-02 3 views
4

나는 그것을 보았다 D.에 ".."연산자를 호출하는 방법을 잘 모르겠어요 :Dlang 조각 및 번호 범위

// Slicing 
int[] t = list[3..$]; 

// Looping 
foreach (x; 1..10) {} 

그러나 내가 일부를 사용할 수 없습니다 것 같다 " 논리적 "예를 들어 장소 :

int[] test = 1..N; 
auto harmonic_serie = map!"1/a"(1..1000); 

가"단지 슬라이싱과 반복 사용할 수 있습니다 ... "단 syntaxic 설탕은? 덜 읽기 쉬운 std.range.iota를 사용해야합니까? 현재 문법

답변

6

..은 슬라이싱에만 사용되며 foreach과 원거리 사례 문입니다. 이러한 컨텍스트 중 어떤 것도 구조체 나 목록을 만드는 것이 필요하지 않습니다. 슬라이싱은 기본적으로 두 인덱스를 취하고 사용하며 foreach은 단순히 첫 번째 값에서 시작하여 두 번째 값에 도달 할 때까지 증가하는 카운터를 사용하여 for 루프로 낮 춥니 다. ..이 다른 컨텍스트에서 작동하려면 일종의 실제 객체로 낮추거나 값에서 생성 된 일종의 목록을 가져야합니다 (적어도 구현이 진행되는 한 훨씬 더 복잡합니다). 그래서 언어는 그 어떤 것도하지 않습니다. 당신이 찾고있는 것과 같은 것을하기 위해서, 컴파일러는 실제로 범위를 생성 할 수 있어야하고, 범위에 대해 이해하는 것은 모두 foreach을 사용하여 범위를 반복하는 데 필요한 것입니다.

std.range.iota은 실제로 범위 인 구조체를 만들고 컴파일러 나 언어가 작동하는 방식에 대해 아무 것도 이해할 필요가 없습니다. 따라서 값 범위를 나타 내기 위해 객체가 필요한 곳에서 사용할 수 있으며 ..은 작동하지 않습니다.

다른 상황에서는 ..iota과 같은 것을 생성하는 것이 기술적으로 가능할 것이라고 확신하지만,이 시점에서 D 언어 디자이너가 취한 접근법은 언어 대신 라이브러리에서 무엇인가를 할 수 있다면, 그것은 도서관에서 끝내야하며, 무엇보다도 라이브러리에 넣기보다는 언어에 기능을 추가하는 것을 후회합니다.

+3

및 사례가없는 사례에서도 마찬가지입니다. 사례 1 : 사례 3 : 케이스 2를 재현합니다. –

+0

@ AdamD.Ruppe Ah, 예. 나는 그것들을 잊었다. 나는 그들을 포함하도록 나의 대답을 업데이트했다. –

1

그것은

모두 Slice Expression 명시 적으로 foreach range expression.. 연산자를 사용하여이

std.range.itoa 결과 명시 적 IntRangeExpression을 만드는 부여하고자 편리 할 문법 설탕에게 있습니다