这里的新语法一般指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. 工控领域上云实践-Zstack和软赢

    工业以太网常见五大协议对比 大规模电机控制的方案选择-电机和驱动器篇 大规模电机控制的方案选择-控制器篇 工控领域有各种各样的总线来通讯以控制设备,很小众的接口规范慢慢的更小众了,最常见的接口规范就是 ...

  2. python爬虫(含scrapy)

    python爬虫 1.解析HTML: lxml 是一种python编写的库,可以迅速.灵活的处理xml和html 使用:根据版本的不同,有如下两种: 形式1: from lxml import etr ...

  3. python爬取网页的多种方式以及保存方法

    爬取网页信息并保存 bs4和lxml都是用来将接收的数据解析html 1.bs4+excel(openpyxl): import requests from bs4 import BeautifulS ...

  4. 打印出来的数据{ob: observer}、vue 中 [__ob__: Observer]问题

    问题效果: 理想效果: 解决方案:JSON.parse(JSON.stringify( ob )) 首先我们要把这个数据获取原始数据 JSON.stringify([data])   变成字符串 然后 ...

  5. Android 7.0+模拟器Fiddler抓包详细教程 fiddler443问题解决办法

    https://blog.csdn.net/qq_43278826/article/details/124291040 [前言]         众所周知,假如设备是android 7.0+的系统同时 ...

  6. JOI 公園 (JOI Park)

    原题链接:AT2434 JOI 公園 (JOI Park) 写完之后看到题解区的三分吓了一跳 分析与解答 由于最终答案与边权有关,所以不妨考虑判断一条边是否会对答案有贡献. 记 \(dis\) 表示以 ...

  7. vue下载zip包到本地

    <script> import axios from 'axios' export default{ methods: { downloadZip (downloadName, downl ...

  8. VUE学习-过渡 & 动画

    过渡 & 动画 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 在过渡钩子函数中使用 JavaScrip ...

  9. pgsql中over函数的应用

    -- sum() over(partition by ... order by ...)SELECT len/sum(len)over(partition by road_id) param from ...

  10. java中List的浅拷贝与深拷贝

    List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式进行存储. 如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指 ...