Sdílet prostřednictvím


Neproměnlivost

Všechny typy v Q# jsou typy hodnot. Q# nemá koncept odkazu nebo ukazatele. Místo toho umožňuje znovu přiřadit novou hodnotu dříve deklarované proměnné pomocí výrazu přiřazení. Například neexistuje rozdíl v chování mezi opětovným přiřazením proměnných typu Int nebo proměnných typu Int[]. Představte si následující posloupnost příkazů:

    mutable arr1 = new Int[3];
    let arr2 = arr1;
    arr1 w/= 0 <- 3;

První příkaz vytvoří instanci nového pole celých čísel [0,0,0] a přiřadí ho arr1. Další příkaz přiřadí hodnotu proměnné s názvem arr2. Poslední příkaz vytvoří novou instanci pole na základě arr1 se stejnými hodnotami s výjimkou hodnoty indexu 0, která je nastavena na hodnotu 3. Nově vytvořené pole se pak přiřadí proměnné arr1. Poslední řádek používá zkrácenou syntaxi pro příkazy evaluate-and-reassigna může být ekvivalentní jako arr1 = arr1 w/ 0 <- 1;.
Po spuštění těchto tří příkazů bude arr1 obsahovat hodnotu [3,0,0], zatímco arr2 zůstane beze změny a obsahuje hodnotu [0,0,0].

Q# jasně rozlišuje proměnlivost popisovače a chování typu. Mutability within Q# is a concept that applies to a symbol than a type or value; vztahuje se na popisovač, který umožňuje přístup k hodnotě, nikoli k samotné hodnotě. Je není reprezentován v systému typů implicitně nebo explicitně.

Samozřejmě je to pouze popis formálně definovaného chování; skutečná implementace používá schéma počítání odkazů, aby se zabránilo kopírování paměti co nejvíce. Úpravy se provádějí konkrétně, pokud existuje pouze jeden aktuálně platný popisovač, který přistupuje k určité hodnotě.