Sdílet prostřednictvím


Přístup k položce

Q# podporuje přístup k položkám pro položky pole a pro položky v uživatelsky definovaných typech. V obou případech je přístup jen pro čtení; hodnotu nelze změnit bez vytvoření nové instance pomocí výrazu copy-and-update.

Přístup k položce pole a vytváření řezů polí

Vzhledem k maticovým výrazům a výrazu typu Int nebo Rangemůže být nový výraz vytvořen pomocí operátoru přístupu k položce pole, který se skládá z [ a ].

Pokud je výraz v závorkách typu Int, obsahuje nový výraz položku pole v daném indexu. Pokud arr je například typ Double[] a obsahuje pět nebo více položek, arr[4] jedná se o výraz typu Double.

Pokud je výraz uvnitř hranatých závorek typu Range, obsahuje nový výraz pole všech položek indexovaných zadaným Rangeobjektem . Pokud je prázdný Range , výsledné pole je prázdné. Třeba

let arr = [10, 11, 36, 49];
let ten = arr[0]; // contains the value 10
let odds = arr[1..2..4]; // contains the value [11, 49]
let reverse = arr[...-1...]; // contains the value [49, 36, 11, 10]

V posledním řádku příkladu byla pro usnadnění vynechána počáteční a koncová hodnota rozsahu. Další informace najdete v tématu Kontextové výrazy.

Pokud maticový výraz není jednoduchý identifikátor, musí být uzavřen v závorkách, aby bylo možné extrahovat položku nebo řez. Pokud arr1arr2 jsou například a obě pole celých čísel, bude položka ze zřetězení vyjádřena jako (arr1 + arr2)[13]. Další informace najdete v tématu Priorita a asociativita.

Všechna pole v Q# souboru jsou založená na nule, to znamená, že první prvek pole arr je vždy arr[0]. Za běhu dojde k výjimce, pokud je index nebo jeden z indexů použitých pro vytváření řezů mimo hranice pole, například pokud je menší než nula, větší nebo roven délce pole.

Přístup k položkě pro uživatelem definované typy

(Další informace o tom, jak definovat vlastní typy obsahující jednu nebo více pojmenovaných nebo anonymních položek, najdete v tématu Deklarace typů).)

K obsaženým položkám je možné přistupovat prostřednictvím jejich názvu nebo pomocí dekonstrukce, což je znázorněno následujícími příkazy, které lze použít jako součást operace nebo implementace funkce:

    let complex = Complex(1., 0.); // create a value of type Complex
    let (re, _) = complex!;       // item access via deconstruction
    let im = complex::Imaginary;  // item access via name

Operátor přístupu k položce (::) načte pojmenované položky, jak je znázorněno v následujícím příkladu:

newtype TwoStrings = (str1 : String, str2 : String);

operation LinkTwoStrings(str : TwoStrings) : String {
    let s1 = str::str1;
    let s2 = str::str2;
    return s1 + s2;
}

K pojmenovaným položkám je sice možné přistupovat podle názvu nebo prostřednictvím dekonstrukce, ale k anonymním položkám má přístup jenom ta druhá. Vzhledem k tomu, že dekonstrukce závisí na všech obsažených položkách, je použití anonymních položek odrazováno, pokud je třeba k těmto položkám přistupovat mimo kompilační jednotku, ve které je typ definován.

Přístup prostřednictvím dekonstrukce využívá operátor unwrap (!). Operátor rozbalení vrátí řazenou kolekci všech obsažených položek, kde tvar řazené kolekce členů odpovídá řazené kolekci členů definovanému v deklaraci a řazená kolekce členů jedné položky je ekvivalentní samotné položce (viz tato část).

Například pro hodnotu nested typu Nested , která je definována takto:

newtype Nested = (Double, (ItemName : Int, String));

výraz nested! vrátí hodnotu typu (Double, (Int, String)).

Operátor ! má nižší prioritu než oba operátory přístupu k položkě, ale vyšší prioritu než jakýkoli jiný operátor. Úplný seznam priorit najdete v tématu Priorita a asociativita.