跳转到内容

Ada 编程/属性/'Update

来自 Wikibooks,开放的书籍,开放的世界

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。

华夏公益教科书