powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества?
25 сообщений из 63, страница 2 из 3
Анонимные методы. Какие дают преимущества?
    #39801331
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stу Анонимных Методов должно быть еще другое преимущество в некоторых оптимизирующих компайлерах их применение позволяет иногда сгенерить код оптимальнее
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801340
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stКлассический вариант такой:

Код: pascal
1.
2.
3.
4.
5.
   function  MySortFunc
   procedure MySmsProc;
   ...
   List.Sort(MySortFunc);
   TThread.CreateAnonymousThread(MySmsProc).Start;



А так стало наглядней ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  List.Sort(function (A, B: TMyRec): boolean
          begin
            Result:=A.Name>B.Name;
          end)

  TThread.CreateAnonymousThread(
    procedure
    begin
      SendSms(ARecipient, AMessage);
    end
    ).Start;



rgreat, asutp2, заранее извините,
я специально чучь-чуть "провоцирую", но честно хочу осознать эту "наглядность"Так - не стало. Но ты забыл реализацию неанонимных функций в код добавить.

Если добавишь и правильно отформатируешь - наглядней будет именно анонимно.
Ибо код функции сортировки будет лежать сразу перед взглядом а не где-то еще.

Но это работает на коротких функциях и процедрурах. Более десятка строк это будет выглядеть слишком тяжеловесно.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801371
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CitePascal-style и наглядность
X-Cite, спасибо, что участвуете в теме.
Я помню, Вы хорошо разбираетесь в C++.

Скажите, в C++ есть возможность описать функцию в любом месте кода, например, внутри цикла “for” ?
Вот, в Delphi это стало возможно. Я искренне пытаюсь осознать какие дает преимущества ... :-/
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801373
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,
В си++ даже лямды появились :) Стандарт расширяется :)
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801388
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stX-CitePascal-style и наглядность
X-Cite, спасибо, что участвуете в теме.
Я помню, Вы хорошо разбираетесь в C++.

Скажите, в C++ есть возможность описать функцию в любом месте кода, например, внутри цикла “for” ?
Вот, в Delphi это стало возможно. Я искренне пытаюсь осознать какие дает преимущества ... :-/
Вы меня с кем-то путаете... Я не разбираюсь в С++

Чтобы понять как работают замыкания и почему анонимные функции как нельзя лучше подходят для "Функций высшего порядка"
https://habr.com/ru/post/244945

Например каррирование или мемоизация - очень мощные штуки, но к сожалению в delphi не работающие нормально... Я уже в QC запостил пару багов с захватом контекста..

Захват контекста нужен, чтобы в другие классы не передавать параметры, которые там не должны жить, т.к. каждый класс должен выполнять ровно одну задачу.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801391
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st...в C++ есть возможность описать функцию в любом месте кода, например, внутри цикла “for” ?
...
Конечно, есть.
Более того, в состав стандартной библиотеки включили специальные формы, основанные на лямбдах:

https://ru.cppreference.com/w/cpp/algorithm/for_each

Лябды в с++ в миллион раз мощнее того, что имеем в дельфи.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801392
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема реализации анонимных функций в Delphi заключается в том, что они реализованы через интерфейсы и не совместимы с реализацией в других языках.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801458
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014,

за это бы им следовала оторвать в руки, и всунуть их на место (в задний проход) . В c# к примеру анонимные функции легко запоминают переданные в них локальные значения, и при вызове сразу нескольких функций, с разными переменными будут давать разный результат, который был передан

А в Delphi что????? Смех один.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using System;

class MainClass {
  delegate void Test(string funcName);
  delegate void Test2();

  static Test2 CallTest(string Name, Test callback)
  {
    return () => { callback(Name); };  
  }

  public static void Main (string[] args) {
    Test2 a = CallTest("Call1",
     (string funcName) => { Console.WriteLine (funcName);   });
    Test2 a2 = CallTest("Call2",
     (string funcName) => { Console.WriteLine (funcName);   });

    a2();
    a();
  }
}

...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801475
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так более эстетичнее
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using System;

class MainClass {
  delegate void Test(string funcName);
  delegate void Test2();

  static Test2 CallTest(string Name, Test callback)
  {
    return () => { callback(Name); };  
  }

  public static void Main (string[] args) {
    Test HTest = (string funcName) => { Console.WriteLine (funcName);   };

    Test2 a = CallTest("Call1", HTest);
    Test2 a2 = CallTest("Call2", HTest);

    a2();
    a();
  }
}

...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801485
Maxim.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Artem.1st "Захват контекста" - это отдать область видимости наружу?
Если "Да" , то опять же обычный Процедурный Тип может быть вложенным(т.е. процедура внутри процедуры).
А значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа.
Так? Нет?
Нет.
Процедурный Тип в Delphi применим только для автономных процедур(не для вложенных). Т.е. вложенные процедуры(компилятор называет “локальными”) не являются Процедурным Типом, и их нельзя использовать в качестве переменных или параметров.

А вот новые Анонимные методы - это вариант вложенных процедур, которые совместимы с Процедурным Типом, и их можно присваивать и передать наружу(с Захваченным контекстом).
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801502
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpcziv-2014,

за это бы им следовала оторвать в руки, и всунуть их на место (в задний проход) . В c# к примеру анонимные функции легко запоминают переданные в них локальные значения, и при вызове сразу нескольких функций, с разными переменными будут давать разный результат, который был передан

А в Delphi что????? Смех один.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using System;

class MainClass {
  delegate void Test(string funcName);
  delegate void Test2();

  static Test2 CallTest(string Name, Test callback)
  {
    return () => { callback(Name); };  
  }

  public static void Main (string[] args) {
    Test2 a = CallTest("Call1",
     (string funcName) => { Console.WriteLine (funcName);   });
    Test2 a2 = CallTest("Call2",
     (string funcName) => { Console.WriteLine (funcName);   });

    a2();
    a();
  }
}

Ммм, это делфи? по мне, так это c++ билдер
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801506
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Массово использую анонимные методы. Например для исключения while not DS.Eof do DS.Next; End; и вообще практически везде, где требуются процедурные типы
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801507
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ааа, поторопился) конечно же, это не с++ билдер) но и не делфи.

Foxpc , приведи пример на делфи, который будет работать некорректно
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801516
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2ааа, поторопился) конечно же, это не с++ билдер) но и не делфи.

Foxpc , приведи пример на делфи, который будет работать некорректно

Это применимо к асинхронному выполнению, когда к примеру захват контекста в одной нити, а выполнение в другой.
Сравните ниже.

Код: 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.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes,
  System.Threading;

begin
  var Lock := TObject.Create();
  for var i := 1 to 10 do
    TTask.Run(
      procedure
      begin
        TMonitor.Enter(Lock);
        Writeln('i = ', i);
        TMonitor.Exit(Lock);
      end
    );

//  Sleep(2000);

  var p := procedure(k: Int32)
           begin
            TTask.Run(
              procedure
              begin
                TMonitor.Enter(Lock);
                Writeln('k = ', k);
                TMonitor.Exit(Lock);
              end
            );
           end;

  for var i := 1 to 10 do
    p(i);
  Readln;
end.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801550
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя в C# тоже самое...
Захват контекста из другой нити работает также
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        static void Test(int i)
        {
            Task.Run(() => System.Console.WriteLine(i));
        }

        static void Main(string[] args)
        {
            for (int i = 1; i <= 10; i++)
            {
                Task.Run(() => System.Console.WriteLine(i)); // Будет как в Delphi 11 11 11 11 ....
            }
            for (int i = 1; i <= 10; i++)
            {
                Test(i);                
            }
            System.Console.ReadKey();
        }
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801559
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЗахват контекста из другой нити работает также
А ява тут сругается, что переменная должна быть финализированной.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801712
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

авторА значит "Захват контекста" можно делать и без Анонимных методов, при помощи обычного вложенного Процедурного Типа. Так? Нет?

Я не знаю что ты называешь процедурным типом.
Но вот так сделать нельзя::

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TSomeClass.OtherMethod;

  procedure Test;
  begin
   Self.SomeMethod; //это метод класса TSomeClass
  end;

begin
  TParallel.For(Test);
end;



Компилятор выдаст ошибку (собственно - из-за отсутствия возможности захватить контекст). И вот что бы это стало возможным как раз анонимные функции и нужны.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801734
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую редко. Но очень классно их использовать для всяких callback

Код: 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.
  TChartSupport = class
  strict private
    type
      TInitSeriesProc<T: TChartSeries> = reference to procedure(ASeries: T);
      TOnMarkerStatus = procedure(const AXMarker, AYMarker: string) of object;
  strict protected
    function AddSeries<T: TChartSeries>(const AName: string;
      const AInit: TInitSeriesProc<T> = nil): T;
  end;

function TChartSupport.AddSeries<T>(const AName: string;
  const AInit: TInitSeriesProc<T>): T;
begin
    Result := FindSrsByTitle<T>(AName);
    if Result = nil then begin
      Result := T(TChartSeriesClass(T).Create(MainChart));
      Result.Active := False;
      Result.ParentChart := MainChart;
      Result.Title := AName;
      Result.ShowInLegend := False;
      Result.XValues.Order := loNone;
      Result.YValues.Order := loNone;
      if Assigned(AInit) then
        AInit(Result);
    end;
  end;
end;

  FMarkerX := AddSeries<TChartShape>(CMarkerXTitle, procedure (ASeries: TChartShape)
    begin
      ASeries.Pen.Width := CLineWidth;
      ASeries.Style := chasVertLine;
      ASeries.BeforeDrawValues := MarkerXBeforeDrawValues;
    end
  );

    Result := AddSeries<TAreaSeries>(LTitle, procedure(ASeries: TAreaSeries)
      begin
        ASeries.Tag := CDataSeries;
        ASeries.AreaLinesPen.Visible := False;
        ASeries.LinePen.Width := 7;
        ASeries.LinePen.Visible := False;
        ASeries.Stairs := True;
        ASeries.ShowInLegend := True;
      end
    );

...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801763
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод как метод только без имени. Но если часто использовать паттерны Visitor, Dependency Injection, Control Inversion и тд, то:
* меньше писать кода;
* код не размазан по юниту а в месте его использования.
PS: Все можно и на ASM написать :)
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801764
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-то выше сказал, что Эмба не использует анонимные методы. Все с точностью наоборот ...
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801797
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Java Script без анонимных/стрелочных функций сейчас как без рук. Все фреймворки под них заточены. Смотрятся они в JS очень красиво (изящнее и читабельнее, чем в лямбды C# из-за динамической типизации).
Зато в JS нет классов (есть только эмуляция за счёт сахара) и такой классной штуки как "function of object" (TMethod) в JS нету, что ведёт в постоянным извращениям типа bind.
Я к тому, что в Delphi анонимные функции нужны куда реже, чем в других языках. Имхо, и слава богу.
Такое ощущение, что некоторые, особенно молодые C# - программисты, начинают забывать (или не знают), как объявить поле класса без лямбд или как сделать обычный метод. Везде лямбды лепят. Это хорошо видно из статей на Хабре, посвящённых C#. В C# сделать анонимный метод с нормальным описанием параметров куда сложнее, чем вставить лямбду. Ведь там нет ключевого слово function / func / fn и т.п., поэтому приходится городить огород.
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801873
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эмба у себя использует, они-то свой продукт лучше всех знают. Потом их спецы едут в народ, опрашивают его, узнают, что народ не очень понимает, зачем это всё надо, и очень расстраиваются. Ну кому понравится, когда старались, работали, а результат не ценят.

авторПроцедурный Тип в Delphi применим только для автономных процедур(не для вложенных). Т.е. вложенные процедуры(компилятор называет “локальными”) не являются Процедурным Типом, и их нельзя использовать в качестве переменных или параметров.

Дык вот это само по себе странность. Причем странность неочевидная, если про нее не знать, как та же невозможность передать property в var параметр. И вообще непонятная. Если можно прямо в центре процедурки зафигачить другую процедурку, которая будет иметь точку входа и при этом еще и захватывать контекст, то что мешает сделать то же самое для вложенных функций, которые с точки зрения их пользователя есть то же самое, только записанное чуть в стороне?
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801876
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar,

Совместимость с легаси
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801887
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы тоже у себя всё чаще используем. Ибо иногда удобнее
...
Рейтинг: 0 / 0
Анонимные методы. Какие дают преимущества?
    #39801921
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

С одной стороны бесспорно то, что Делфи всегда был хорош обратной совместимостью. И до 90% кода еще первых версий соберется либо сразу (если изначально был хорошо написан - то скорее всего и соберется) либо с минимальными правками. Для долгоиграющих проектов отличный язык.
Для сравнения путь Гугл: постоянно ломается совместимость, а потом программеры плачут:
https://habr.com/ru/post/446346/
С другой, я сам слабо понимаю, какая совместимость может сломаться если локальные процедуры будет разрешено передавать как процедурный тип (если, конечно, подходят параметры). Или почему запрещено передавать проперти как переменные. Особенно те, которые без сеттеров.
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Анонимные методы. Какие дают преимущества?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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