複製和更新表達式
為了減少可變動系結的需求,Q# 支援陣列的複製和更新運算式,這可讓您透過索引或索引範圍存取專案。
複製和更新表達式會具現化新的數位,並將所有項目設定為原始數位中對應的值,但特定指定的專案除外,這些專案會設定為表達式右側定義的專案。
它們是使用三元運算符建構 w/
<-
;語法 w/
應讀為 「with」 的常用簡短表示法:
original w/ itemAccess <- modification
其中 original
是陣列運算式,itemAccess
是數位配量有效的任何表達式,modification
是新的值或值。 具體地說,itemAccess
表示式的類型可以是 Int
或 Range
。 如果 itemAccess
是 Int
類型的值,則 modification
的類型必須符合數位的項目類型。 如果 itemAccess
是類型為 Range
的值,則 modification
的類型必須與數位類型相同。
例如,如果 arr
包含數位 [0, 1, 2, 3]
,則
-
arr w/ 0 <- 10
是陣列[10, 1, 2, 3]
。 -
arr w/ 2 <- 10
是陣列[0, 1, 10, 3]
。 -
arr w/ 0..2..3 <- [10, 12]
是陣列[10, 1, 12, 3]
。
就優先順序而言,copy-and-update 運算符是左關聯,且優先順序最低,特別是優先順序低於範圍運算符 (..
) 或三元條件運算符 (?
|
)。
選擇的左關聯性可讓您輕鬆鏈結複製和更新表示式:
let model = ArrayConstructor()
w/ 1 <- alpha
w/ 3 <- gamma
w/ 5 <- epsilon;
至於建構與最左邊表達式相同類型之表達式的任何運算符,可以使用對應的 evaluate-and-reassign 語句。
例如,下列兩個語句會達成下列目的:第一個語句會宣告可變數 arr
,並將它系結至整數數位的預設值。 第二個語句接著會建置新的數位,並將第一個專案 (索引 0) 設定為 10,並將它重新指派給 arr
。
mutable arr = [0, size = 3]; // arr contains [0, 0, 0]
arr w/= 0 <- 10; // arr contains [10, 0, 0]
第二個語句只是簡短的語法 arr = arr w/ 0 <- 10;
。
複製和更新表達式允許根據現有數位有效率地建立新的數位。 copy-and-update 表達式的實作可避免複製整個數位,方法是只複製必要的元件以達到所需的行為,並盡可能執行就地修改。 因此,陣列初始化不會因為不變性而產生額外的額外負荷。
Std.Arrays
命名空間提供方便的工具庫來建立和操作陣列。
複製和更新表達式是即時建構新數位的便利方式;例如,下列表達式會評估為陣列,其中所有專案都設定為 PauliI
,但索引 i
的專案除外,其設定為 PauliZ
:
[PauliI, size = n] w/ i <- PauliZ