zoukankan      html  css  js  c++  java
  • 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.
    
  • 相关阅读:
    DevExpress.XtraBars.BarManager去掉分割线/分隔符
    C# ToShortDateString() ToString() 设置日期格式的区别
    DevExpress.XtraEditors.TextEdit绑定数据后,不输入内容,出现 “Invalid Value” 无效值错误
    stuff(select ',' + fieldname from tablename for xml path('')),1,1,'')
    string、Empty和null三者的区别
    js数组定义
    Clementine学习
    实现getElementsByClassName
    如何让ajax执行完后再继续往下执行?
    java中arraylist和数组的转换
  • 原文地址:https://www.cnblogs.com/del/p/1268301.html
Copyright © 2011-2022 走看看