Delphi 新语法:匿名函数
这里的新语法一般指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;
对代码进行简化在简化是为了我们方便理解.
type
// 首先声明匿名方法的类型
TIntSum = reference to function(x, y: Integer): Integer;function Calc(x, y: Integer; intSum: TIntSum): Integer;
begin
Result := intSum(x, y);
end;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 新语法:匿名函数的更多相关文章
- MVC新语法匿名方法
一.简单匿名方法 1.0匿名方法的写法规则: delegate(编写匿名方法的参数,格式和类型由程序员自己根据业务逻辑来定义){函数的方法体代码} 最下面使用deledate编写匿名方法参数所写 ...
- delphi新语法之泛型实现的对象池模板
现在的DELPHI因为支持泛型的语法,所以也能支持模板编程了. // 标准模板 unit UntPools; interface uses Classes, SysUtils, Unt ...
- Delphi新语法 For ..In
首先我们要知道哪些类型可以用For In吧,下面就是: for Element in ArrayExpr do Stmt; 数组 for Element in StringExpr do S ...
- Delphi新语法
http://www.cnblogs.com/hnxxcxg/category/456344.html
- Delphi TButton.OnClick 匿名函数用法
type TNotifyEventRef = reference to procedure(Sender: TObject); function AnonymousEvent(const Proc: ...
- python基础——匿名函数及递归函数
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
- Golang函数-匿名函数与闭包函数
Golang函数-匿名函数与闭包函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 【Go语言学习】匿名函数与闭包
前言 入坑 Go 语言已经大半年了,却没有写过一篇像样的技术文章,每次写一半就搁笔,然后就烂尾了. 几经思考,痛定思痛,决定金盆洗手,重新做人,哦不,重新开始写技术博文. 这段时间在研究Go语言闭包的 ...
- Delphi 7以来的Delphi 2009测试版新语法特性
我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
随机推荐
- 工控领域上云实践-Zstack和软赢
工业以太网常见五大协议对比 大规模电机控制的方案选择-电机和驱动器篇 大规模电机控制的方案选择-控制器篇 工控领域有各种各样的总线来通讯以控制设备,很小众的接口规范慢慢的更小众了,最常见的接口规范就是 ...
- python爬虫(含scrapy)
python爬虫 1.解析HTML: lxml 是一种python编写的库,可以迅速.灵活的处理xml和html 使用:根据版本的不同,有如下两种: 形式1: from lxml import etr ...
- python爬取网页的多种方式以及保存方法
爬取网页信息并保存 bs4和lxml都是用来将接收的数据解析html 1.bs4+excel(openpyxl): import requests from bs4 import BeautifulS ...
- 打印出来的数据{ob: observer}、vue 中 [__ob__: Observer]问题
问题效果: 理想效果: 解决方案:JSON.parse(JSON.stringify( ob )) 首先我们要把这个数据获取原始数据 JSON.stringify([data]) 变成字符串 然后 ...
- Android 7.0+模拟器Fiddler抓包详细教程 fiddler443问题解决办法
https://blog.csdn.net/qq_43278826/article/details/124291040 [前言] 众所周知,假如设备是android 7.0+的系统同时 ...
- JOI 公園 (JOI Park)
原题链接:AT2434 JOI 公園 (JOI Park) 写完之后看到题解区的三分吓了一跳 分析与解答 由于最终答案与边权有关,所以不妨考虑判断一条边是否会对答案有贡献. 记 \(dis\) 表示以 ...
- vue下载zip包到本地
<script> import axios from 'axios' export default{ methods: { downloadZip (downloadName, downl ...
- VUE学习-过渡 & 动画
过渡 & 动画 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 在过渡钩子函数中使用 JavaScrip ...
- pgsql中over函数的应用
-- sum() over(partition by ... order by ...)SELECT len/sum(len)over(partition by road_id) param from ...
- java中List的浅拷贝与深拷贝
List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式进行存储. 如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指 ...