Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передать в аннонимную функцию - статичную переменную / 17 сообщений из 17, страница 1 из 1
02.06.2018, 12:38
    #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
02.06.2018, 13:26
    #39654339
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
Димoнасик,

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

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

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

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

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

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

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

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

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

Почему не может? Или правильнее сказать, не умеет? Это обычный static , из с++ к примеру
потому что внутренние переменные функции - это дело только самой функции и того кода, который в ней находится
...
Рейтинг: 0 / 0
02.06.2018, 15:22
    #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
02.06.2018, 15:47
    #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
02.06.2018, 17:43
    #39654372
AX-Class
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
AX-ClassОн не кеширует функции, он захватывает 1 переменную в 5 разных функций.
Неправда. Откуда там 5-ти функциям взяться. Одна функция, а точнее ссылка на интерфейс 5 раз копируется в список.
...
Рейтинг: 0 / 0
02.06.2018, 17:50
    #39654374
AX-Class
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
ДимoнасикА можно как нибудь изменить через asm код внутреннее представления какой нибудь переменной ?
В asm внутренних переменных нет.
Захваченные переменные анонимных функций можно менять. Только нужно ли?
...
Рейтинг: 0 / 0
02.06.2018, 19:38
    #39654383
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
В ассемблере можно сделать что угодно. Даже такие странные вещи. Пока что главный вопрос остался за кадром: цель? Зачем делать заведомо плохо, если можно сделать заведомо хорошо?
...
Рейтинг: 0 / 0
02.06.2018, 19:46
    #39654385
Димoнасик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
makhaon,

Цель была убрать из функции поиск по базе. Сразу дать нужный адрес в анонимную функцию. Жертвуя ОЗУ, а не ПЗУ
...
Рейтинг: 0 / 0
02.06.2018, 21:47
    #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
03.06.2018, 00:44
    #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
03.06.2018, 01:35
    #39654434
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
defecatorчёртовы извращенцы.
после таких код переписывать сущий ад
Заметь: я просто точно следую исходному ТЗ и никакой лишней отсебятины... :)
...
Рейтинг: 0 / 0
03.06.2018, 07:24
    #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
03.06.2018, 11:24
    #39654453
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать в аннонимную функцию - статичную переменную
В Delphi замыкания захватываются по ссылке, а не по значению.. Поэтому в 5 случаях будет захвачена по сути одна переменная.
Подробнее можно прочитать тут :
Вариант с вынесением кода во внешнюю функцию от AX-Class единственный нормальный. т.к. там по сути пришедшая со стека переменная будет на каждую итерацию по новому адресу.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передать в аннонимную функцию - статичную переменную / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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