这里的新语法一般指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

Delphi 新语法:匿名函数的更多相关文章

  1. MVC新语法匿名方法

    一.简单匿名方法 1.0匿名方法的写法规则: delegate(编写匿名方法的参数,格式和类型由程序员自己根据业务逻辑来定义){函数的方法体代码} 最下面使用deledate编写匿名方法参数所写    ...

  2. delphi新语法之泛型实现的对象池模板

    现在的DELPHI因为支持泛型的语法,所以也能支持模板编程了.   // 标准模板 unit UntPools;   interface   uses   Classes, SysUtils, Unt ...

  3. Delphi新语法 For ..In

    首先我们要知道哪些类型可以用For In吧,下面就是: for Element in ArrayExpr do Stmt;      数组 for Element in StringExpr do S ...

  4. Delphi新语法

    http://www.cnblogs.com/hnxxcxg/category/456344.html

  5. Delphi TButton.OnClick 匿名函数用法

    type TNotifyEventRef = reference to procedure(Sender: TObject); function AnonymousEvent(const Proc: ...

  6. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

  7. Golang函数-匿名函数与闭包函数

    Golang函数-匿名函数与闭包函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. 【Go语言学习】匿名函数与闭包

    前言 入坑 Go 语言已经大半年了,却没有写过一篇像样的技术文章,每次写一半就搁笔,然后就烂尾了. 几经思考,痛定思痛,决定金盆洗手,重新做人,哦不,重新开始写技术博文. 这段时间在研究Go语言闭包的 ...

  9. Delphi 7以来的Delphi 2009测试版新语法特性

    我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...

  10. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

随机推荐

  1. Excel文件 利用MySQL/Python 实现自动处理数据的功能

    目录 问题描述: 解决方案: 一.SQL查询 二.SQL.python处理 三.python处理 四.优化python处理 1.手动执行代码 2.开机自动执行代码 对比四种方案: 总结: 问题描述: ...

  2. RabbitMQ基础和解疑

    一.基础概念 1. Producer:生产者,就是投递消息的一方 消息一般可以包含2个部分:消息体和标签(Label).消息体也可以称之为payload,在实际应用中,消息体一般是一个带有业务逻辑结构 ...

  3. sql 查找连续的时间区间以及连续天数

    create table tmptable(rq datetime) go insert tmptable values('2010.1.1') insert tmptable values('201 ...

  4. pat乙级1022 D进制的A+B

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #de ...

  5. SystemVerilog Tutorial

    来自网站 1.网站说明-tutorial This SystemVerilog tutorial is written to help engineers with background in Ver ...

  6. Android 之Map容器替换 SparseArray,ArrayMap,ArraySet

    高效程序有两个重要指标:速度,内存,移动app中内存比重要多一些,为此在速度相差不是很大的时候,优先考虑内存,container是一个重要部分,对此google对一些原java容器设计新的容器进行替换 ...

  7. [WPF]MVVM的数据绑定

    啥是MVVM? 我理解的MVVM是Model(数据),View(界面),ViewModel(数据与界面之间的桥梁)的缩写,是一种编程模式.前期需要多花一些时间去编辑绑定,在后期维护方便.只需要关注数据 ...

  8. Code Review在TDSQL-C 的应用实践

    1.1 为什么重视Code Review? 结合下面这个例子,我们来谈谈为什么要重视code review.假设你作为新人刚入职,领导分配了一个需求,于是接下来做了下面这些事: 为了完成任务疯狂敲了三 ...

  9. Vue项目使用/deep/报错:SassError: expected selector解决方案--亲测有效

    项目npm run dev报错如下: 解决方法: 尝试用 ::v-deep 替换 /deep/ ,成功解决了问题. 效果如下图所示(完美解决~) 某些预处理器(例如Sass)可能无法>>& ...

  10. Bugku-ez_misc[wp]

    题目描述 1.拿到一份abc.rar文件,里面有一个加密call.png (1)通过file  . binwalk . 伪加密一顿小输出都不行,于是放进16进制编辑器查看: 文件头不对! (2)修改为 ...