Megosztás a következőn keresztül:


Környezetfüggő és kihagyott kifejezések

A környezetfüggő kifejezések olyan kifejezések, amelyek csak bizonyos környezetekben érvényesek, például az elemek neveinek használata másolási és frissítési kifejezésekben anélkül, hogy minősíteni kellene őket.

A kifejezések elhagyhatók, ha a fordító kikövetkezteti őket, és automatikusan beszúrja őket, például kiértékelési és hozzárendelési utasítások esetén.

A nyílt végű tartományok egy másik példa, amely a környezetfüggő és a kihagyott kifejezésekre is vonatkozik. Ezek csak bizonyos kontextusban érvényesek, és a fordító lefordítja őket normál Range kifejezésekre a fordítás során megfelelő határok következtetésével.

Egy típusérték Range egész számok sorozatát hozza létre, amelyeket egy kezdőérték, egy lépésérték (nem kötelező) és egy végérték határoz meg. A literális kifejezés 1..3 például Range az 1,2,3 sorozatot hozza létre. Hasonlóképpen, a kifejezés 3..-1..1 a 3,2,1 sorozatot hozza létre. Tartományokkal is létrehozhat új tömböt egy meglévőből szeleteléssel, például:

    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]

Nem definiálhat végtelen tartományt a következőben Q#: a kezdő és a záró értékeket mindig meg kell adni. Az egyetlen kivétel az, ha tömb szeletelésére használ egy Range tömböt. Ebben az esetben a fordító ésszerűen kikövetkeztetheti a tartomány kezdő vagy záró értékeit.

Az előző tömbszeletelési példákban ésszerű, ha a fordító feltételezi, hogy a kívánt tartományvégnek a tömb utolsó elemének indexe kell lennie, ha a lépésméret pozitív. Ha a lépés mérete negatív, akkor a tartományvég valószínűleg a tömb első elemének indexe lesz. 0 A converzum a tartomány elejére tart.

Összegzésként, ha kihagyja a tartomány kezdőértékét, a kikövetkeztetett kezdési érték

  • nulla, ha nincs megadva lépés, vagy a megadott lépés pozitív.
  • a tömb hossza mínusz egy, ha a megadott lépés negatív.

Ha kihagyja a tartomány végértékét, a késleltetett végérték

  • a tömb hossza mínusz egy, ha nincs megadva lépés, vagy a megadott lépés pozitív.
  • nulla, ha a megadott lépés negatív.

Q# ezért lehetővé teszi a tömb szeletelő kifejezéseken belüli nyílt végű tartományok használatát, például:

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

Mivel annak meghatározása, hogy a tartománylépés pozitív vagy negatív,futásidőben történik-e, a fordító beszúr egy megfelelő kifejezést, amely futásidőben lesz kiértékelve. A kihagyott végértékek esetében a beszúrt kifejezés step < 0 ? 0 | Length(arr)-1, a kihagyott kezdőértékek step < 0 ? Length(arr)-1 | 0esetében pedig az, hogy hol step van a tartománylépéshez megadott kifejezés, vagy 1 ha nincs megadva lépés.