powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / with и без with
68 сообщений из 68, показаны все 3 страниц
with и без with
    #39911503
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
type
  TRecord = record
    A: Integer;
    B: Integer;
    C: Double;
  end;

  TRecordArray = array of TRecord;

procedure TForm9.FormCreate(Sender: TObject);
var
  RA: TRecordArray;
begin
  SetLength(RA, 10);
  with RA[1] do
  begin
    A := 3;
    B := 2;
    C := 1;
  end;
  RA[1].A := 3;
  RA[1].B := 2;
  RA[1].C := 1;
end;



Я думал, компилятор выделенное давно умеет оптимизировать...
...
Рейтинг: 0 / 0
with и без with
    #39911520
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том числе поэтому я за with.
...
Рейтинг: 0 / 0
with и без with
    #39911530
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Решается дополнительной локальной переменной (указатель на TRecord), их компилятор умеет раскладывать по регистрам если ему не мешать. with, в текущем её виде, очень опасная конструкция.
...
Рейтинг: 0 / 0
with и без with
    #39911599
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

А оптимизацию в debug-сборке включили?..
...
Рейтинг: 0 / 0
with и без with
    #39911612
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Я проверял релизную сборку и сморел внешним дизассемблером. Оптимизации это не про дельфю.
...
Рейтинг: 0 / 0
with и без with
    #39911684
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Квейд,

А оптимизацию в debug-сборке включили?..
разумеется
...
Рейтинг: 0 / 0
with и без with
    #39911689
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел FPC, он в обоих вариантах обновляет значение EAX. Дополнительная переменная ему тоже помогает.
...
Рейтинг: 0 / 0
with и без with
    #39911701
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел ещё Oxygene... Он вообще выкинул лишние операции, оставив только однократное присваивание. А чтобы он и его не выкинул пришлось в конце метода добавить вывод в консоль. Вот что LLVM животворящий умело приготовленный делает. Эх... :(
...
Рейтинг: 0 / 0
with и без with
    #39911712
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это только с динамическим массивом, а вот с таким
PRecordArray = ^TRecordArray;
TRecordArray = array[0..9] of TRecord;
нормально оптимизирует. И вроде бы с дин. массивом переданным как const.
...
Рейтинг: 0 / 0
with и без with
    #39911728
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
Вот что LLVM животворящий умело приготовленный делает. Эх... :(
Можно и к fpc прикрутить LLVM, но не под Виндой.
https://wiki.freepascal.org/LLVM#Build_FPC_with_LLVM_support
...
Рейтинг: 0 / 0
with и без with
    #39911736
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

Да, я вкурсе (+18% к производительности, неплохо так).
...
Рейтинг: 0 / 0
with и без with
    #39911746
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
18% они получили на самом компиляторе - в целом не очень впечатляет, но это видимо из-за того, что там алгоритмы не векторизуемые и/или никто специально не затачивал под векторизацию.
Если заточить, тогда должно быть больше. Видимо, это они имеют в виду под "Artificial benchmarks will also be much faster".
...
Рейтинг: 0 / 0
with и без with
    #39911749
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sapersky,

В том то и дело, что на обычном коде c обычным набором команд, а не на заточеном бенче. Это круто. На вычислительных задачах должно быть значительно больше, это да. Впрочем, у них и своя векторизация есть т.ч. отрыв может и не быть значительным (правда, я не смог собрать бенчик с использованием AVX, компилятор постоянно падал. Хотя, давно это было).
...
Рейтинг: 0 / 0
with и без with
    #39915725
KtoI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очевидно что
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  RA: TRecordArray;
  v : TRecord;
begin
  SetLength(RA, 10);
    
  v := RA[1];
  v.A := 3;
  v.B := 2;
  v.C := 1;
end.



либо
Код: pascal
1.
 with RA[1] do



Всё остальное говнокод. А ну да, в новых версиях тип auto var
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[SRC delphi]var
  RA: TRecordArray;
begin
  SetLength(RA, 10);
    
  var v := RA[1];
  v.A := 3;
  v.B := 2;
  v.C := 1;
end.

[/SRC]
...
Рейтинг: 0 / 0
with и без with
    #39915740
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что будет в RA после таких присвоений?
...
Рейтинг: 0 / 0
with и без with
    #39915766
KtoI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DmSer,

Код: pascal
1.
 var v := RA[1];



будет ровно

Код: pascal
1.
2.
3.
4.
var
  v : TRecord;
begin
  v := RA[1];



100% одинаковый код листинг
...
Рейтинг: 0 / 0
with и без with
    #39915780
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KtoI
DmSer,

Код: pascal
1.
 var v := RA[1];



будет ровно

Код: pascal
1.
2.
3.
4.
var
  v : TRecord;
begin
  v := RA[1];



100% одинаковый код листинг


Учитывайте, что только в случае использования with будет изменён элемент массива RA.
...
Рейтинг: 0 / 0
with и без with
    #39915800
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пофантазирую...

Оператору with в Паскале не хватает возможности определения алиасов. Было бы здорово иметь такой синтаксис:
with myArray[i] as a, myObject as o do
begin
a := 1;
o.Value := a;
end;
Это позволило бы сделать оператор with более безопасным, а синтаксис языка более приятным.
...
Рейтинг: 0 / 0
with и без with
    #39915806
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
И что будет в RA после таких присвоений?
Указатели наше все :)
...
Рейтинг: 0 / 0
with и без with
    #39915809
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
with myArray[i] as a, myObject as o do
Так нельзя. AS это приведение типа
...
Рейтинг: 0 / 0
with и без with
    #39915821
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
DmSer
with myArray[i] as a, myObject as o do
Так нельзя. AS это приведение типа


Вместо as можно предложить и другой набор букв, это не самое главное. Да и с as можно разрулить, было бы желание.
...
Рейтинг: 0 / 0
with и без with
    #39915834
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
with myArray[i] as a, myObject as o do

В Oxygene это выглядит так:
Код: pascal
1.
2.
with a := myArray[i], o := myObject do
...
...
Рейтинг: 0 / 0
with и без with
    #39915911
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Пофантазирую...

Оператору with в Паскале не хватает возможности определения алиасов. Было бы здорово иметь такой синтаксис:
with myArray[i] as a, myObject as o do
begin
a := 1;
o.Value := a;
end;
Это позволило бы сделать оператор with более безопасным, а синтаксис языка более приятным.


Для этого with не нужен, решается через обычные переменные:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var 
  a: PInteger;
  o: TMyObject absolute MyObject;
...
  a := @myArray[i]
...
  a^ := 1;
  o.Value := 1;
...
...
Рейтинг: 0 / 0
with и без with
    #39915918
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
DmSer
Пофантазирую...

Оператору with в Паскале не хватает возможности определения алиасов. Было бы здорово иметь такой синтаксис:
with myArray[i] as a, myObject as o do
begin
a := 1;
o.Value := a;
end;
Это позволило бы сделать оператор with более безопасным, а синтаксис языка более приятным.


Для этого with не нужен, решается через обычные переменные:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var 
  a: PInteger;
  o: TMyObject absolute MyObject;
...
  a := @myArray[i]
...
  a^ := 1;
  o.Value := 1;
...



Согласен, способов написать отвратный код в Delphi предостаточно (как и везде). Я-то другое предлагаю: способ, позволяющий в некоторый случаях писать более приятный код.
...
Рейтинг: 0 / 0
with и без with
    #39915929
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO, оператор width лучше реализован в VisualBasic : свойства, которые относятся к переменной из with предваряются точкой, сам символ, конечно, не важен, можно заменить на "~", например. Тогда можно писать:
Код: sql
1.
2.
3.
4.
5.
with Bmp1,Bmp2 do
begin
 ~Width:=~~Width;
 ~Height:=~~Height;
end;


Конструкция, когда есть вложенные операторы width (неважно в краткой или полной записи), достаточно редки, т.к. приводят к совсем трудно понимаемому коду, но когда используются свойства в методах, это было бы удобно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm.SomeProc(ABmp:TBitmap);
begin
  with ABmp do
  begin
    ~Width:=Width;
    ~Height:=Height;
  end;
end;


В такой конструкции происходит присвоение битмапу размеров формы.

Возможно, смысл такой записи можно интерпретировать и наоборот :)
...
Рейтинг: 0 / 0
with и без with
    #39915931
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Символ "~" лучше определить как пространство имен окружающее текущий блок, т.е.
Код: sql
1.
2.
3.
4.
5.
with Bmp1,Bmp2 do
begin
  Width:=~Width;
  Height:=~Height;
end;


эквивалентен
Код: sql
1.
2.
Bmp2.Width:=Bmp1.Width;
Bmp2.Height:=Bmp1.Height;


и
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm.SomeProc(ABmp:TBitmap);
begin
  with ABmp do
  begin
    Width:=~Width;
    Height:=~Height;
  end;
end;


приводит битмап к размерам формы.
...
Рейтинг: 0 / 0
with и без with
    #39915936
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трешак.
...
Рейтинг: 0 / 0
with и без with
    #39915938
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064
IMHO, оператор width лучше реализован в VisualBasic : свойства, которые относятся к переменной из with предваряются точкой, сам символ, конечно, не важен, можно заменить на "~", например.
...
но когда используются свойства в методах, это было бы удобно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm.SomeProc(ABmp:TBitmap);
begin
  with ABmp do
  begin
    ~Width:=Width;
    ~Height:=Height;
  end;
end;



В такой конструкции происходит присвоение битмапу размеров формы.

В таком коротком куске кода необходимости отмечать что-то точкой или любым другим символом нет никакой необходимости. И так всё ясно. А в кусках кода, которые не влезают на один экран оператор wit h лучше не использовать. Даже если код пишется одним автором, а не группой.
...
Рейтинг: 0 / 0
with и без with
    #39915940
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя да. Был не прав не поняв сути предложения.
Но в любом случае я за явное указание:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm.SomeProc(ABmp:TBitmap);
begin
  with ABmp do
  begin
    Width:=Self.Width;
    Height:=Self.Height;
  end;
end;
...
Рейтинг: 0 / 0
with и без with
    #39915949
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener,

Код: pascal
1.
2.
ABmp.Width:=Self.Width;
ABmp.Height:=Self.Height;


И короче и надежней.
...
Рейтинг: 0 / 0
with и без with
    #39915958
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
northener,

Код: pascal
1.
2.
ABmp.Width:=Self.Width;
ABmp.Height:=Self.Height;


И короче и надежней.


По ощущениям: бывают ситуации, когда с with получается наглядней, поскольку производится оформление в виде блока с соответствующим отступом, например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with ds.FieldByName('PRICE') do
begin
  Visible := True;
  Width := 100;
  DisblayLabel := 'Цена';
end;

with ds.FieldByName('OSTATOK') do
begin
  Visible := True;
  Width := 100;
  DisblayLabel := 'Остаток';
end;

with ds.FieldByName('NAME') do
begin
  Visible := True;
  Width := 200;
  DisblayLabel := 'Наименование';
end;
...
Рейтинг: 0 / 0
with и без with
    #39915959
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Умеет кто-нибудь искать задачи на https://quality.embarcadero.com/, касающиеся улучшения работы оператора "with"? Такое ощущение, что движок поиска удаляет это слово :(
...
Рейтинг: 0 / 0
with и без with
    #39915968
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Если хочешь зафичреквестить, то такая попытка уже была: https://quality.embarcadero.com/browse/RSP-21420
...
Рейтинг: 0 / 0
with и без with
    #39915974
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
DmSer,

Если хочешь зафичреквестить, то такая попытка уже была: https://quality.embarcadero.com/browse/RSP-21420


Там автор хрень какую-то предложил, в итоге Марко Канто предложил выпилить конструкцию with :)
...
Рейтинг: 0 / 0
with и без with
    #39915985
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой запрос хочу к ним запулить:

The "with" operator in Pascal is very useful. In many cases, it improves code readability. Many programmers who communicate in the Delphi forum use it, like it, but note that there are a number of problems. Here are some of the problems:
1) it is inconvenient to debug code in the with block;
2) the danger of using the "with" operator for several elements at once;
3) if there are several variables with the same name in different scopes, it is difficult to understand which variable the "with"operator will choose.

To solve these problems, I suggest adding the ability to declare aliases in the "with" operator. For example, this way (using the keyword "as" as it is done in the SQL language):
with MyArrayOfRecords[i] as r, GetMyObject() as o do
begin
r. IntVal: = 1;
r. StrVal : = 'Hello';
o. MyRec: = r;
end;

In addition, this would make it easier to modify elements of arrays of records (at the moment, you have to specify the array name every time or use pointers, which worsens the readability of the code).
I know that the "as" operator in Pascal is already used in some cases (type casting, interface query), so you can use another keyword, this is not the most important thing.

You can also consider declaring aliases that have been implemented in the Oxygene language:
https://docs.elementscompiler.com/Oxygene/Statements/With/
(although, it may be less readability)


Кто в английском силён, может что перефразировать?
...
Рейтинг: 0 / 0
with и без with
    #39915987
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
в итоге Марко Канто предложил выпилить конструкцию with :)

Ну, он об этом давно (где-то, в районе выхода XE4) уже говорил, ещё когда обсуждался перевод "классического" кода на мобильный нексджен. Впрочем, он же говорил и о том, что не видит причин для добавления инлайновых переменных , а через релиз они появились :)
...
Рейтинг: 0 / 0
with и без with
    #39916060
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer

The "with" operator in Pascal is very useful....


=>

Pascal’s "WITH" statement is extremely harmful and potentially dangerous.
...
Рейтинг: 0 / 0
with и без with
    #39916065
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
DmSer

пропущено...


=>

Pascal’s "WITH" statement is extremely harmful and potentially dangerous.


С таким лучше и не пытаться :)
...
Рейтинг: 0 / 0
with и без with
    #39916069
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Pascal’s "WITH" statement is extremely harmful and potentially dangerous

Правильнее сформулировать так :)
авторPascal’s "WITH" statement is potentially dangerous, and can be extremely harmful in curved hands, as russians will say.
...
Рейтинг: 0 / 0
with и без with
    #39916078
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
автор...and can be extremely harmful in curved hands, as russians will say.

... in the crooked hands of Russian programmers.
...
Рейтинг: 0 / 0
with и без with
    #39916082
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да почему же "Russian" ... Одинаково применимо ко всей планете.
...
Рейтинг: 0 / 0
with и без with
    #39916104
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
with и без with
    #39916106
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer

Начнутся новые тараканы, типа конфликтов имен with-алиасов с чем-нибудь.

Лучше бы with вообще запретить, а ввести ссылки, как в c++.
...
Рейтинг: 0 / 0
with и без with
    #39916113
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
Начнутся новые тараканы, типа конфликтов имен with-алиасов с чем-нибудь.

С чем-нибудь это с чем? Псевдоним перекрывает любые видимые (в случае наличия локальных - ошибка компиляции) идентификаторы и действует в рамках выражения.
...
Рейтинг: 0 / 0
with и без with
    #39916120
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
ёёёёё
Начнутся новые тараканы, типа конфликтов имен with-алиасов с чем-нибудь.

С чем-нибудь это с чем? Псевдоним перекрывает любые видимые (в случае наличия локальных - ошибка
компиляции) идентификаторы и действует в рамках выражения.

Будет миленько, когда внутри with имена членов "оголяемой" структуры совпадут с with-алиасом.
...
А ссылка в с++ - это псевдоним, только без глупого with.
...
Рейтинг: 0 / 0
with и без with
    #39916125
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
Будет миленько, когда внутри with имена членов "оголяемой" структуры совпадут с with-алиасом.
...

Доступ к членам только через псевдоним. Неоднозначности там просто не может возникнуть. Или я не понимаю о чём ты.
...
Рейтинг: 0 / 0
with и без with
    #39916131
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
ёёёёё
Будет миленько, когда внутри with имена членов "оголяемой" структуры совпадут с with-алиасом.
...

Доступ к членам только через псевдоним. Неоднозначности там просто не может возникнуть. Или я не понимаю о чём ты.

То есть, прежний паскаль-код компилироваться не будет? Заради чего тогда вообще with сохранять?
...
Рейтинг: 0 / 0
with и без with
    #39916135
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
То есть, прежний паскаль-код компилироваться не будет?

Ну да.

ёёёёё
Заради чего тогда вообще with сохранять?

Удобная штука, иногда.
...
Рейтинг: 0 / 0
with и без with
    #39916137
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть, прежний паскаль-код компилироваться не будет?

Почему не будет? Прежний код будет работать как и прежде. Но если задан алиас, то работать только через алиас.
...
Рейтинг: 0 / 0
with и без with
    #39916138
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

В таких изменениях смысла нет.
...
Рейтинг: 0 / 0
with и без with
    #39916141
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
То есть, прежний паскаль-код компилироваться не будет?


Почему не будет? Прежний код будет работать как и прежде. Но если задан алиас, то работать только через алиас.
А если
Код: pascal
1.
2.
3.
4.
with a as b, c do begin


end


?
...
Рейтинг: 0 / 0
with и без with
    #39916142
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
DmSer
пропущено...


Почему не будет? Прежний код будет работать как и прежде. Но если задан алиас, то работать только через алиас.

А если
Код: pascal
1.
2.
3.
4.
with a as b, c do begin


end


?


Значит обращаться можно будет:
1. К переменным a, b, c
2. К внутренностям c.
Обращение к внутренностям a возможно только через указание a или алиаса b.
...
Рейтинг: 0 / 0
with и без with
    #39916143
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
DmSer,

В таких изменениях смысла нет.


Почему?
...
Рейтинг: 0 / 0
with и без with
    #39916145
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
ёёёёё
пропущено...

А если
Код: pascal
1.
2.
3.
4.
with a as b, c do begin


end



?


Значит обращаться можно будет:
1. К переменным a, b, c
2. К внутренностям c.
Обращение к внутренностям a возможно только через указание a или алиаса b.

О чем я о сказал: 22062685
...
Рейтинг: 0 / 0
with и без with
    #39916147
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрен на шило ...
...
Рейтинг: 0 / 0
with и без with
    #39916150
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нынче можно и так извратиться.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
type
  TMyRec = record
    A : integer;
    B : integer;
  end;
  PMyRec = ^TMyRec;
var
  Arr : array of TMyRec;
begin
  SetLength(Arr,10);

  begin var R: PMyRec := @Arr[1];
    R.A:=1;
    R.B:=2;
  end;
end.
...
Рейтинг: 0 / 0
with и без with
    #39916151
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Почему?

Потому что нет смысла вводить новую сущность, если она не избавляет от старых проблем. Тут нужно, либо полностью отказываться от with, чего не хотелось бы, либо делать псевдонимы безальтернативными.
...
Рейтинг: 0 / 0
with и без with
    #39916158
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat
northener,

Код: pascal
1.
2.
ABmp.Width:=Self.Width;
ABmp.Height:=Self.Height;


И короче и надежней.

В таком простом случае да. И я тут скорее всего так и написал бы (особенно учитывая старые сложности с просмотром в отладчике значений). Но если полей объекта/записи несколько больше чем два, то с with всё-таки короче а порой и наглядней как заметил DmSer .
...
Рейтинг: 0 / 0
with и без with
    #39916160
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WITH - такая же неотъемная и полезная часть языка, как и READLN/WRITELN.
...
Рейтинг: 0 / 0
with и без with
    #39916177
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх не сталкивались Вы с тем, что может навсегда привить стойкое отвращение к конструкциям типа with.
Представьте себе старинный, унаследованный код, процедура длиной около 5000 строк, в процедуре три вложенных цикла и два вложенных with....
...
Рейтинг: 0 / 0
with и без with
    #39916178
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius
в процедуре три вложенных цикла и два вложенных with....

Мелочи какие...
...
Рейтинг: 0 / 0
with и без with
    #39916250
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учитывая уже добавленные инлайн переменные, максимум, что они могут сделать, это

Код: pascal
1.
2.
with var a := some.long.path1, b := some.long.path2 do
  a.foo := b.bar



остальные варианты конструкций вряд ли будут вводить
...
Рейтинг: 0 / 0
with и без with
    #39916268
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sinemurius
Эх не сталкивались Вы с тем, что может навсегда привить стойкое отвращение к конструкциям типа with.
Представьте себе старинный, унаследованный код, процедура длиной около 5000 строк, в процедуре три вложенных цикла и два вложенных with....

Вообще-то процедура в 5000 строк и без with может привить стойкое отвращение к чему угодно. :)
...
Рейтинг: 0 / 0
with и без with
    #39916275
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
DmSer
пропущено...


Значит обращаться можно будет:
1. К переменным a, b, c
2. К внутренностям c.
Обращение к внутренностям a возможно только через указание a или алиаса b.

О чем я о сказал: 22062685


Для варианта без алиаса можно выводить предупреждение "deprecated".
...
Рейтинг: 0 / 0
with и без with
    #39916504
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius,
да ничего такого. главное каши в названиях не делать.
...
Рейтинг: 0 / 0
with и без with
    #39916529
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Учитывая уже добавленные инлайн переменные, максимум, что они могут сделать, это

Код: pascal
1.
2.
with var a := some.long.path1, b := some.long.path2 do
  a.foo := b.bar



остальные варианты конструкций вряд ли будут вводить

Нормальный вариант!
...
Рейтинг: 0 / 0
with и без with
    #39916533
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для классов это и так работает. достаточно заменить with на begin.

Проблема с рекордами.
...
Рейтинг: 0 / 0
with и без with
    #39916600
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon
Sinemurius,
да ничего такого. главное каши в названиях не делать.

Значит не сталкивались. Скорее всего :)
Имхо такую простыню нужно либо сразу переделать, либо сразу отказаться от её поддержки.
...
Рейтинг: 0 / 0
68 сообщений из 68, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / with и без with
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]