13.2.8 Оператор With

На верх  Назад  Вперёд

Оператор with служит для доступа к элементам записи, объекта или класса, без указания каждый раз полного имени этого элемента. Синтаксис оператора with


Оператор with

1318


Переменная ссылка должна быть переменной типа записи, объекта или класса. В операторе with,любая ссылка на переменную или метод проверяется, чтобы увидеть что это поле, метод записи, объекта или класса. Если да, то поле доступно и к нему можно обратится, или можно вызвать метод. Примем во внимание определение:

Type

Passenger = Record

  Name : String[30];

  Flight : String[10];

end;

 

Var

TheCustomer : Passenger;

Тогда следующие присвоения полностью эквивалентны:

TheCustomer.Name := 'Michael';

TheCustomer.Flight := 'PS901';

и

With TheCustomer do

begin

  Name := 'Michael';

  Flight := 'PS901';

end;

Оператор

With A,B,C,D do Statement;

эквивалентен

With A do

With B do

With C do

  With D do Statement;

Это говорит о том, что переменные ищутся от последнего к первому, то есть, когда компилятор встречает ссылку на переменную, он сначала проверить, это поле или метод в последней переменной (ссылке). Если поля нет, то он проверит предпоследнюю (ссылку), и так далее. Следующий пример демонстрирует это;

Program testw;

Type AR = record

    X,Y : Longint;

    end;

    PAR = ^Ar;

 

Var S,T : Ar;

begin

S.X := 1;S.Y := 1;

T.X := 2;T.Y := 2;

With S,T do WriteLn (X,' ',Y);

end.

Эта программа выведет

2 2

Таким образом, X, Y в операторе Writeln совпадают с полями переменной записи T.

Примечание:

Использовании оператора with с указателем или классом, не допускается, для изменения самого указателя или класса в блоке with.Используя определения предыдущего примера, проиллюстрируем о чём идёт речь:

Var p : PAR;

 

begin

With P^ do

  begin

    // Некоторые операции

    P:=OtherP;

    X:=0.0; // Будет использовано не то поле X  !!

  end;

Указатель не может быть изменен по тому что адрес хранится компилятором во временном регистре. Изменение указателя не изменит временный адрес. Это же верно и для классов.