Share via


Bağlamsal ve atlanmış ifadeler

Bağlamsal ifadeler, öğe adlarını nitelemeden kopyalama ve güncelleştirme ifadelerinde kullanma gibi yalnızca belirli bağlamlarda geçerli olan ifadelerdir .

İfadeler, derleyici tarafından çıkarılıp otomatik olarak eklenebildiği zaman atlanabilir, örneğin evaluate-and-reassign deyimleri söz konusu olduğunda.

Açık uçlu aralıklar, hem bağlamsal hem de atlanmış ifadeler için geçerli olan başka bir örnektir. Bunlar yalnızca belirli bir bağlamda geçerlidir ve derleyici uygun sınırlar çıkararak bunları derleme sırasında normal Range ifadelere çevirir.

Tür Range değeri, bir başlangıç değeri, bir adım değeri (isteğe bağlı) ve bir bitiş değeri ile belirtilen bir tamsayı dizisi oluşturur. Örneğin, Range değişmez ifade 1..3 1,2,3 dizisini oluşturur. Benzer şekilde, ifade 3..-1..1 3,2,1 dizisini oluşturur. Ayrıca dilimleyerek mevcut diziden yeni bir dizi oluşturmak için de aralıkları kullanabilirsiniz, örneğin:

    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]

içinde Q#sonsuz bir aralık tanımlayamazsınız; başlangıç ve bitiş değerlerinin her zaman belirtilmesi gerekir. Tek özel durum, bir diziyi dilimlerken bir Range kullanmanızdır. Bu durumda, aralığın başlangıç veya bitiş değerleri derleyici tarafından makul bir şekilde çıkarılabilir.

Önceki dizi dilimleme örneklerinde, adım boyutu pozitifse derleyicinin hedeflenen aralık sonunun dizideki son öğenin dizini olması gerektiğini varsayması mantıklıdır. Adım boyutu negatifse, aralık sonu büyük olasılıkla dizideki 0ilk öğenin dizini olmalıdır. Ters, aralığın başlangıcı için tutar.

Özetlemek gerekirse, aralık başlangıç değerini atlarsanız, çıkarsanan başlangıç değeri

  • hiçbir adım belirtilmezse veya belirtilen adım pozitifse sıfır olur.
  • belirtilen adım negatifse dizinin uzunluğu eksi bir olur.

Aralık bitiş değerini atlarsanız, çıkarsanan bitiş değeri

  • , hiçbir adım belirtilmezse veya belirtilen adım pozitifse dizinin uzunluğu eksi bir olur.
  • belirtilen adım negatifse sıfır olur.

Q# bu nedenle dizi dilimleme ifadeleri içinde açık uçlu aralıkların kullanılmasına izin verir, örneğin:

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];

Aralık adımının pozitif mi yoksa negatif mi olduğunu belirleme çalışma zamanında gerçekleştiğinden, derleyici çalışma zamanında değerlendirilecek uygun bir ifade ekler. Atlanan bitiş değerleri için, eklenen ifade olur step < 0 ? 0 | Length(arr)-1ve atlanan başlangıç değerleri step < 0 ? Length(arr)-1 | 0için ise , burada step aralık adımı için verilen ifadedir veya 1 hiçbir adım belirtilmezse.