这里的新语法一般指Delphi7不支持的语法.

对于比较简单实现,不需要复用,开发者更喜欢在使用时,原地声明,而没有必要单独声明并实现这个方法.

通过关键字reference来定义一个匿名函数.

下面直接来段简单的代码

type
// 首先声明匿名方法的类型(两个整形参数,返回值亦是整形)
TIntSum = reference to function(x, y: Integer): Integer; type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function Calc(x, y: Integer; intSum: TIntSum): Integer;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt('x + y = %d', [Calc(10, 15,
function(x, y: Integer): Integer
begin
Result := x + y;
end)]);
end; function TForm1.Calc(x, y: Integer; intSum: TIntSum): Integer;
begin
Result := intSum(x, y);
end;

对代码进行简化在简化是为了我们方便理解.

  1. type

    // 首先声明匿名方法的类型

    TIntSum = reference to function(x, y: Integer): Integer;

  2. function Calc(x, y: Integer; intSum: TIntSum): Integer;

    begin

    Result := intSum(x, y);

    end;

  3. Calc(10, 15,

    function(x, y: Integer): Integer

    begin

    Result := x + y;

    end);

2中的Calc函数第三个参数是匿名函数,一会你们谁想用这个函数,得先把第三个参数(匿名函数)具体用法给我实现了在传进来.

3中开始调用Calc,果然直接就开始实现函数具体的功能:

function(x, y: Integer): Integer//不要带什么符号

begin

Result := x + y;

end

这函数啥功能?两个参数相加,然后返回.好了,最后看下

function Calc(x, y: Integer; intSum: TIntSum): Integer;

begin

Result := intSum(x, y);

end;

第三个参数被传进来的同时,这个函数的功能也已经被传进来,而且这个匿名函数intSum还可以调用前面的参数x和y.

好像有点搞,不使用这种语法也可以编程,但我们不使用不等于别人不使用,学会了方便阅读别人的源代码.

使用本地变量

匿名函数功能实现部分是可以使用外一层的变量的.

看如下代码:

type
// 首先声明匿名方法的类型
TIntSum = reference to procedure(x, y: Integer); type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function Calc(x, y: Integer; intSum: TIntSum): Integer;
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
var
lResult: Integer;
begin
Calc(40, 30,
procedure(x, y: Integer)
begin
lResult := lResult + x + y;
end);
ShowMessageFmt('x + y = %d', [lResult]); // 调用三次,结果是210
end; function TForm1.Calc(x, y: Integer; intSum: TIntSum): Integer;
begin
intSum(x, y);
intSum(x, y);
intSum(x, y);
end;

lResult 是外一层的变量,匿名函数内部可以使用.

扩展本地变量的生命周期

本地变量,一般是随着函数执行结束,就不能再访问;

而如果在匿名函数,访问了外部函数的本地变量,本地变量的生命周期会被扩展

看如下代码:

type
// 首先声明匿名方法的类型
TIntSum = reference to procedure(x, y: Integer); type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
function Calc(x, y: Integer; intSum: TIntSum): Integer; public
intSum: TIntSum;
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
begin
Calc(40, 30, intSum);
end; function TForm1.Calc(x, y: Integer; intSum: TIntSum): Integer;
begin
intSum(x, y);
end; procedure TForm1.FormCreate(Sender: TObject);
var
lResult: Integer;
begin
lResult := 100;
intSum := procedure(x, y: Integer)
begin
lResult := lResult + x + y;
ShowMessageFmt('x + y = %d', [lResult]);
end;
end;

现在FormCreate中把匿名函数的功能给实现了,lResult初始值为100.

按理说FormCreate结束后lResult作为局部变量也就无法再访问,但是由于匿名函数内部使用了lResult,lResult := lResult + x + y;

之后其他地方调用匿名函数会不断的重复使用lResult,而且每次用完lResult的值是会保存下来供下次使用的.就像全局变量一般.

参考:https://www.cnblogs.com/iihe602/archive/2013/02/21/2920694.html

最新文章

  1. 复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~
  2. jquery源码学习之queue方法
  3. printf 格式化输出符号详细说明(转)
  4. 1682: [Usaco2005 Mar]Out of Hay 干草危机
  5. java方向及学习方法
  6. input上传图片(file),预览图片的两种方法。blob与base64编码
  7. 【新版】Android技术博客精华汇总
  8. 2013年第四届蓝桥杯javaB组 试题 答案 解析
  9. 什么是ORM?
  10. SpeedReader for Mac(快速阅读器)v1.6免费版
  11. 完美解决xhost +报错: unable to open display "" 装oracle的时候总是在弹出安装界面的时候出错
  12. PopupWindow 学习总结
  13. AD绘制PCB时,贴片封装器件的焊盘间距小于10Mil,报错解决
  14. POJ3635 Full Tank?
  15. layout/reflow
  16. backup与recover
  17. SQL datediff()函数 时间差
  18. [javaEE] 控制浏览器缓存资源
  19. 如何修改JComboBox的宽度
  20. Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节

热门文章

  1. day15-SpringMVC执行流程
  2. ORACLE数据库相关操作
  3. Solon v2.1.4 发布。支持 java、kotlin、groovy!
  4. VueJs 监听 window.resize 方法---窗口变化
  5. 【django-vue】封装logger 封装全局异常 封装response 数据库配置 用户表继承AbstractUser配置
  6. asp输入框input通用输入限制
  7. 关于cnpm的卸载与重装
  8. Chisel项目中,添加了一个文件,新增了一个模块,但是却编译不出来相应的.v文件,什么原因?
  9. 2022-05-16内部群每日三题-清辉PMP
  10. web基础(3):CSS样式