• Delphi 2009 中的匿名方法(reference to)



    之前我们可以定义方法类型, 然后通过方法类型的变量来使用方法, 譬如:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    Type
      TFun = function(const num: Integer): Integer; {先定义一个方法类型}
    
      function MySqr(const num: Integer): Integer;  {再创建一个吻合上面类型的一个方法}
      begin
        Result := num * num;
      end;
    
    {测试}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      fun: TFun;  {方法变量}
      n: Integer;
    begin
      fun := MySqr;             {给变量赋值为相同格式的方法}
      n := fun(9);              {现在这个方法变量可以使用了}
      ShowMessage(IntToStr(n)); {81}
    end;
    
    end.
    
    之所以这样做, 是因为有时需要把 "方法" 当作参数, 譬如:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    Type
      TFun = function(const num: Integer): Integer; {先定义一个方法类型}
    
      function MySqr(const num: Integer): Integer;  {再创建一个吻合上面类型的一个方法}
      begin
        Result := num * num;
      end;
    
      {把方法当作参数的方法}
      procedure MyProc(var x: Integer; fun: TFun);
      begin
        x := fun(x);
      end;
    
    {测试}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      n: Integer;
    begin
      n := 9;
      MyProc(n, MySqr);
      ShowMessage(IntToStr(n)); {81}
    end;
    
    end.
    
    现在 Delphi 2009 可以使用匿名方法了(使用 reference 定义方法类型, 然后在代码中随用随写方法), 譬如:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    Type
      TFun = reference to function(const num: Integer): Integer; {用 reference 定义匿名方法类型}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      fun: TFun;
      n: Integer;
    begin
      {求平方}
      fun := function(const a: Integer): Integer {注意本行最后不能有 ; 号}
      begin
        Result := a * a;
      end;
    
      n := fun(9);
      ShowMessage(IntToStr(n)); {81}
    
      {求倍数}
      fun := function(const a: Integer): Integer
      begin
        Result := a + a;
      end;
    
      n := fun(9);
      ShowMessage(IntToStr(n)); {18}
    end;
    
    end.
    
    把匿名方法当作其他方法的参数:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    Type
      TFun = reference to function(const num: Integer): Integer;
    
      function FunTest(const n: Integer; fun: TFun): string;
      begin
        Result := Format('%d, %d', [n, fun(n)]);
      end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      f: TFun;
      s: string;
    begin
      f := function(const a: Integer): Integer {注意本行最后不能有 ; 号}
      begin
        Result := a * a;
      end;
    
      s := FunTest(9, f);
    
      ShowMessage(s); {9, 81}
    end;
    
    end.
    
  • 相关阅读:
    c#配置文件
    C#预处理指令
    C#面向对象详解
    231. Power of Two
    226. Invert Binary Tree
    C语言函数入参压栈顺序为什么是从右向左?
    对C++ 虚函数的理解
    悲观锁和乐观锁
    什么是索引
    CHAR 和VARCHAR的区别
  • 原文地址:https://www.cnblogs.com/del/p/1268301.html
Copyright © 2020-2023  润新知