Ada 程式設計/屬性/'Update
外觀
Update 屬性建立一個數組或記錄值的副本,其中包含一個或多個修改後的元件。語法是
PREFIX'Update ( RECORD_COMPONENT_ASSOCIATION_LIST )
PREFIX'Update ( ARRAY_COMPONENT_ASSOCIATION {, ARRAY_COMPONENT_ASSOCIATION } )
PREFIX'Update ( MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION
{, MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION } )
MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION ::= INDEX_EXPRESSION_LIST_LIST => EXPRESSION
INDEX_EXPRESSION_LIST_LIST ::= INDEX_EXPRESSION_LIST {| INDEX_EXPRESSION_LIST }
INDEX_EXPRESSION_LIST ::= ( EXPRESSION {, EXPRESSION } )
其中 PREFIX 是陣列或記錄物件的名稱,括號中的關聯列表不包含 others 選擇,並且框符號 <> 不得出現在任何表示式中。其效果是生成陣列或記錄值的副本,該副本除了關聯列表中提到的元件外,其他部分保持不變,這些元件將更改為指示的值。陣列或記錄值的原始值不受影響。例如
type Arr is Array (1 .. 5) of Integer;
...
Avar1 : Arr := (1,2,3,4,5);
Avar2 : Arr := Avar1'Update (2 => 10, 3 .. 4 => 20);
為 Avar2 生成一個值為 1,10,20,20,5 的值,而 Avar1 保持不變。類似地
type Rec is A, B, C : Integer;
...
Rvar1 : Rec := (A => 1, B => 2, C => 3);
Rvar2 : Rec := Rvar1'Update (B => 20);
為 Rvar2 生成一個值為 (A => 1, B => 20, C => 3) 的值,而 Rvar1 保持不變。請注意,屬性引用值的計算是在使用它之前完成的。這意味著,如果您編寫
Avar1 := Avar1'Update (1 => 10, 2 => Function_Call);
那麼,如果 Function_Call 丟擲異常,則 Avar1 的值不會被修改,這與對 Avar1 的元素進行一系列直接賦值的效果不同。通常,這需要建立物件的兩份額外的完整副本,在考慮效率時應牢記這一點。
Update 屬性不能應用於受限型別的名字首,在記錄型別的情況下,不能引用鑑別式。更新屬性結果物件的訪問級別定義與聚合相同。
在記錄的情況下,不能多次提及任何元件。在陣列的情況下,關聯列表中可以出現兩個重疊的範圍,在這種情況下,修改將從左到右進行處理。
可以修改多維陣列,例如
A : array (1 .. 10, 1 .. 10) of Integer;
..
A := A'Update ((1, 2) => 20, (3, 4) => 30);
將元素 (1,2) 更改為 20,將元素 (3,4) 更改為 30。