6. Операторы
45
6.2.5. Оператор присоединения (WITH)
WithStatement =
'with' VariableRef {',' VariableRef } 'do'
 Statement.
Оператором присоединения (WithStatement) можно сократить описание
обращений к полям переменной записного типа. Он открывает область действия,
содержащую имена полей указанной переменной записного типа, так что эти имена
могут фигурировать как имена обычных переменных. Внутри этого оператора поля
переменной записного типа обозначаются с помощью только их имен. При трансляции
каждый идентификатор проверяется на принадлежность к именам полей переменной
записного типа (VariableRef). Если это так, то это интерпретируется как стандартное
обращение к полю этой переменной.
Примечание: Если имя некоторой переменной совпадает с именем поля
переменной записного типа, то в рамках оператора присоединения WITH эта
переменная становится недоступной. Например:
var Field: integer;
Rec: record
Field, b: real;
end;
(* ................... *)
with Rec do begin
Field:= 1;
end;
(* ................... *)
В этом фрагменте программы значение 1 присваивается полю Field типа Real
переменной Rec, а не целой переменной Field. После выхода из оператора with целая
переменная Field снова становится доступной.
Для сокращенной записи множества вложений операторов with разрешается
задавать список имен переменных или полей переменных. Оператор:
with r1, r2, ...., rn do .......
эквивалентен следующему:
with r1 do
with r2 do
...........
with rn do ........ .
Если при задании записи используется указатель или индексация массива, то эти
действия совершаются только раз в начале оператора WITH. Например, следующие два
фрагмента программы не эквивалентны. При том вероятнее всего выполнение второго
приведет к непредсказуемым результатам, если значение переменной I не определено
в начале оператора WITH. А если переменная I определена, то оператор WITH сделает
10 присваиваний одному и тому же элементу массива (в результате этот элемент будет
иметь последнее присвоенное ему значение). Выполнением первого фрагмента
программы присваиваются значения всем 10 элементам массива. Предположим, что
сделано следующее определение:
var MyArray: array [1 .. 10] of record
X, Y: integer;
end { MyArray};
<<  <  GO  >  >>

Вернуться к началу сайта