다음을 통해 공유


상황에 맞는 식 및 생략된 식

상황별 식은 특정 컨텍스트에서만 유효한 식입니다. 예를 들어 복사 및 업데이트 식에서 항목 이름을 사용할 때는 정규화할 필요 없이.

식은 계산 및 재할당 문과 같이 컴파일러에서 유추하고 자동으로 삽입할 수 있는 경우 생략할 수 있습니다.

개방형 범위는 컨텍스트 식과 생략된 식 모두에 적용되는 또 다른 예입니다. 특정 컨텍스트 내에서만 유효하며 컴파일러는 적절한 경계를 유추하여 컴파일 중에 정규 Range 식으로 변환합니다.

Range 형식의 값은 시작 값, 단계 값(선택 사항) 및 끝 값으로 지정된 정수 시퀀스를 생성합니다. 예를 들어 Range 리터럴 식 1..3 시퀀스 1,2,3을 생성합니다. 마찬가지로 식 3..-1..1 시퀀스 3,2,1을 생성합니다. 예를 들어 범위를 사용하여 기존 배열에서 새 배열을 만들 수도 있습니다.

    let arr = [1,2,3,4];
    let slice1 = arr[1..2..4];  // contains [2,4] 
    let slice2 = arr[2..-1..0]; // contains [3,2,1]

Q#무한 범위를 정의할 수 없습니다. 시작 및 끝 값을 항상 지정해야 합니다. 유일한 예외는 Range 사용하여 배열을 조각화할 때입니다. 이 경우 컴파일러는 범위의 시작 또는 끝 값을 합리적으로 유추할 수 있습니다.

이전 배열 조각화 예제에서는 단계 크기가 양수인 경우 컴파일러에서 의도한 범위 끝이 배열의 마지막 항목 인덱스여야 한다고 가정하는 것이 합리적입니다. 단계 크기가 음수이면 범위 끝은 배열에서 첫 번째 항목의 인덱스일 가능성이 0. 이 대화는 범위의 시작 부분에 대해 유지됩니다.

요약하자면 범위 시작 값을 생략하면 유추된 시작 값입니다.

  • 는 단계가 지정되지 않거나 지정된 단계가 양수이면 0입니다.
  • 는 지정된 단계가 음수이면 배열 길이에서 1을 뺀 값입니다.

범위 끝 값을 생략하면 유추된 끝 값입니다.

  • 은 지정된 단계가 없거나 지정된 단계가 양수이면 배열 길이에서 1을 뺀 값입니다.
  • 지정된 단계가 음수이면 0입니다.

따라서 Q# 배열 조각화 식 내에서 개방형 범위를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

let arr = [1,2,3,4,5,6];
let slice1  = arr[3...];      // slice1 is [4,5,6];
let slice2  = arr[0..2...];   // slice2 is [1,3,5];
let slice3  = arr[...2];      // slice3 is [1,2,3];
let slice4  = arr[...2..3];   // slice4 is [1,3];
let slice5  = arr[...2...];   // slice5 is [1,3,5];
let slice7  = arr[4..-2...];  // slice7 is [5,3,1];
let slice8  = arr[...-1..3];  // slice8 is [6,5,4];
let slice9  = arr[...-1...];  // slice9 is [6,5,4,3,2,1];
let slice10 = arr[...];       // slice10 is [1,2,3,4,5,6];

범위 단계가 양수인지 아니면 음수인지를 결정하는 작업이 런타임에 발생하므로 컴파일러는 런타임에 평가되는 적절한 식을 삽입합니다. 생략된 끝 값의 경우 삽입된 식은 step < 0 ? 0 | Length(arr)-1있으며 생략된 시작 값의 경우 step < 0 ? Length(arr)-1 | 0, 여기서 step 범위 단계에 지정된 식이거나, 단계가 지정되지 않은 경우 1.