powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передать в аннонимную функцию - статичную переменную
17 сообщений из 17, страница 1 из 1
Передать в аннонимную функцию - статичную переменную
    #39654330
Димoнасик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно ли такое сделать?

Требуется назначить несколько обработчиков,которые будут вызываться по мере необходимости, и каждый обработчик должен иметь идентификатор, для возможности работы и индивидуально

Данная мысль пришла, когда появилось узкое место, ибо в дырке для всех, нужно было искать того самого парня. И задача встала, неверной дырке дать, постоянного парня (статичного) Сделав дырку, верной, и благородной с.


Пример кода, тут за пример взят тип string, но в будущем это может быть адрес на выделенную структуру

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections;

type
  TEventTest = reference to function: string;

var
  List: TList<TEventTest>;
  SetIdentifier_ID: string;
  I: Integer;
  Event: TEventTest;

begin
  List := TList<TEventTest>.Create;

  for I := 0 to 5 do
  begin
    SetIdentifier_ID := 'TestId' + I.ToString;

    Event := function: string
      var
        Identifier_ID: string;
      begin
        Identifier_ID := SetIdentifier_ID;
        Result := Identifier_ID;
        Writeln('Set Id: ', Result);
      end;

    List.Add(Event);
  end;
  for I := 0 to 5 do
  begin
    Writeln('Result Id: ', TEventTest(List.Items[I])());
  end;

  Readln;

end.




Пример кода на другом языке, который такое может


http://sandbox.onlinephpfunctions.com/code/8d18b88ebae45444bc0c7e655142e21391b361f6

Результат
Код: sql
1.
2.
3.
4.
5.
TestId0
TestId1
TestId2
TestId3
TestId4




Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?php
$List = [];
for($i = 0; $i < 5; ++$i) {
    $SetIdentifier_ID = 'TestId' . $i;
    
    $List[] = function() use ($SetIdentifier_ID) {
        echo $SetIdentifier_ID, PHP_EOL;
    };
}


for($i = 0; $i < 5; ++$i) {
    $List[$i]();
}

...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654339
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Димoнасик,

авторПередать в аннонимную функцию - статичную переменную

Так всё и передалось. результат получился равный последнему значению переменной, то есть 5. Вроде всё максимально прозрачно?
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654341
Димoнасик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon,

Статичную не на стороне внешнего кода, а внутреннего - для анонимной функции.

Каждый вызов функции, содержит свою статичную переменную, со своим значением, НЕ Равным, последнему значению в локале

Я как понимаю ещё, он в добавок кэширует анонимные функции, для чего то.
Хотя правильнее было бы создавать новую
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654342
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Димoнасикmakhaon,

Статичную не на стороне внешнего кода, а внутреннего - для анонимной функции.

Каждый вызов функции, содержит свою статичную переменную, со своим значением, НЕ Равным, последнему значению в локале

Я как понимаю ещё, он в добавок кэширует анонимные функции, для чего то.
Хотя правильнее было бы создавать новую
прямого доступа к внутренним переменным функции снаружи нет и быть не может
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654344
Димoнасик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Почему не может? Или правильнее сказать, не умеет? Это обычный static , из с++ к примеру
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654345
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Димoнасикdefecator,

Почему не может? Или правильнее сказать, не умеет? Это обычный static , из с++ к примеру
потому что внутренние переменные функции - это дело только самой функции и того кода, который в ней находится
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654352
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимoнасикЯ как понимаю ещё, он в добавок кэширует анонимные функции, для чего то.
Хотя правильнее было бы создавать новую
Он не кеширует функции, он захватывает 1 переменную в 5 разных функций.
Сравни с этим:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function CreateEventTest(s: string): TEventTest;
begin
  Result := function: string
    var
      Identifier_ID: string;
    begin
      Identifier_ID := s;
      Result := Identifier_ID;
      Writeln('Set Id: ', Result);
    end;
end;
...
List.Add(CreateEventTest(SetIdentifier_ID));
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654355
Димoнасик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AX-Class,

А можно как нибудь изменить через asm код внутреннее представления какой нибудь переменной ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Result := function: string
    var
      Identifier_ID: string;
    begin

    end;

asm
 mov Result.Identifier_ID, 'NewValue'

end;




Наверное это возможно, но я не понимаю как каким будет адрес


Есть ещё вариант попробовать внутри функции создать const переменную, и её как нибудь ?
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654372
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-ClassОн не кеширует функции, он захватывает 1 переменную в 5 разных функций.
Неправда. Откуда там 5-ти функциям взяться. Одна функция, а точнее ссылка на интерфейс 5 раз копируется в список.
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654374
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимoнасикА можно как нибудь изменить через asm код внутреннее представления какой нибудь переменной ?
В asm внутренних переменных нет.
Захваченные переменные анонимных функций можно менять. Только нужно ли?
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654383
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ассемблере можно сделать что угодно. Даже такие странные вещи. Пока что главный вопрос остался за кадром: цель? Зачем делать заведомо плохо, если можно сделать заведомо хорошо?
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654385
Димoнасик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon,

Цель была убрать из функции поиск по базе. Сразу дать нужный адрес в анонимную функцию. Жертвуя ОЗУ, а не ПЗУ
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654403
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Димoнасик,

Ну как вариант:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
program AnonFunc;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections;

type
  TEventTest = reference to function(ID: string): string;
  TEventRec = record
    Event: TEventTest;
    ID: string;
  end;

var
  List: TList<TEventRec>;
  SetIdentifier_ID: string;
  I: Integer;
  Event: TEventRec;
begin
  List := TList<TEventRec>.Create;

  for I := 0 to 5 do
  begin
    Event.ID := 'TestId' + IntToStr(I);
    Event.Event := function(ID: string): string
      var
        Identifier_ID: string;
      begin
        Identifier_ID := ID;
        Result := Identifier_ID;
        Writeln('Set Id: ', Result);
      end;

    List.Add(Event);
  end;
  for I := 0 to 5 do
  begin
    Writeln('Result Id: ', TEventRec(List.Items[I]).Event(TEventRec(List.Items[I]).ID));
  end;

  Readln;

end.

...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654431
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alekcvpДимoнасик,

Ну как вариант:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
program AnonFunc;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections;

type
  TEventTest = reference to function(ID: string): string;
  TEventRec = record
    Event: TEventTest;
    ID: string;
  end;

var
  List: TList<TEventRec>;
  SetIdentifier_ID: string;
  I: Integer;
  Event: TEventRec;
begin
  List := TList<TEventRec>.Create;

  for I := 0 to 5 do
  begin
    Event.ID := 'TestId' + IntToStr(I);
    Event.Event := function(ID: string): string
      var
        Identifier_ID: string;
      begin
        Identifier_ID := ID;
        Result := Identifier_ID;
        Writeln('Set Id: ', Result);
      end;

    List.Add(Event);
  end;
  for I := 0 to 5 do
  begin
    Writeln('Result Id: ', TEventRec(List.Items[I]).Event(TEventRec(List.Items[I]).ID));
  end;

  Readln;

end.



чёртовы извращенцы.
после таких код переписывать сущий ад
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654434
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorчёртовы извращенцы.
после таких код переписывать сущий ад
Заметь: я просто точно следую исходному ТЗ и никакой лишней отсебятины... :)
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654439
под ван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecatoralekcvpДимoнасик,

Ну как вариант:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
program AnonFunc;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections;

type
  TEventTest = reference to function(ID: string): string;
  TEventRec = record
    Event: TEventTest;
    ID: string;
  end;

var
  List: TList<TEventRec>;
  SetIdentifier_ID: string;
  I: Integer;
  Event: TEventRec;
begin
  List := TList<TEventRec>.Create;

  for I := 0 to 5 do
  begin
    Event.ID := 'TestId' + IntToStr(I);
    Event.Event := function(ID: string): string
      var
        Identifier_ID: string;
      begin
        Identifier_ID := ID;
        Result := Identifier_ID;
        Writeln('Set Id: ', Result);
      end;

    List.Add(Event);
  end;
  for I := 0 to 5 do
  begin
    Writeln('Result Id: ', TEventRec(List.Items[I]).Event(TEventRec(List.Items[I]).ID));
  end;

  Readln;

end.



чёртовы извращенцы.
после таких код переписывать сущий ад
Работает же -- смысл повторно в этой куче мараться и ковыряться ?Оставить там коментарий о тяжолом наследии, указать оригинальное авторсво и забыть как страшный сон - тебе ли не знать первый пунтк инструкции?
...
Рейтинг: 0 / 0
Передать в аннонимную функцию - статичную переменную
    #39654453
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Delphi замыкания захватываются по ссылке, а не по значению.. Поэтому в 5 случаях будет захвачена по сути одна переменная.
Подробнее можно прочитать тут :
Вариант с вынесением кода во внешнюю функцию от AX-Class единственный нормальный. т.к. там по сути пришедшая со стека переменная будет на каждую итерацию по новому адресу.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передать в аннонимную функцию - статичную переменную
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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