Delphi - reference to (匿名方法)
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.
之前我们可以定义方法类型, 然后通过方法类型的变量来使用方法, 譬如:
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.
参考: