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 elemnevek használata másolási és frissítési kifejezésekben anélkül, hogy minősíteni kellene őket.

A kifejezések kihagyhatók , amikor a fordító kikövetkezteti őket, és automatikusan beszúrják őket, például kiértékelési és újbóli hozzárendelési utasításokat.

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ó megfelelő határok következtetésével lefordítja őket normál Range kifejezésekre a fordítás során.

A Range típusú érték 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 Range konstans kifejezés 1..3 például az 1,2,3 sorozatot hozza létre. Hasonlóképpen, a 3..-1..1 kifejezés 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 Q#; a kezdő és a záró értéket mindig meg kell adni. Az egyetlen kivétel az, ha Range használ egy tömb szeleteléséhez. Ebben az esetben a fordító észszerűen következtethet a tartomány kezdő vagy záró értékeire.

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# így 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-e futásidőben, a fordító beszúr egy megfelelő kifejezést, amelyet futásidőben értékelnek ki. A kihagyott végértékek esetében a beszúrt kifejezés step < 0 ? 0 | Length(arr)-1, a kihagyott kezdőértékek esetében pedig step < 0 ? Length(arr)-1 | 0, ahol step a tartománylépéshez megadott kifejezés, vagy 1, ha nincs megadva lépés.