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。