这里的新语法一般指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. Linux的简介、历史

    开始linux Java开发之路: javaSE.Mysql. 前端.(HTML\CSS\JS).javaWeb.SSM框架.SpringBoot.Vue.SpringCloud Linux.中间件 ...

  2. 三分钟实战手写Spring Boot Starter

    1 背景 在平时的开发中,开发的同学会把一些通用的方法,写成一个工具类,例如日期转换的,JSON转换的等等,方便业务后续调用,使代码更容易维护. 如果一些更常用的方法,例如鉴权的,加解密的等等,几乎每 ...

  3. JZOJ 3527.迷宫花坛(garden)

    题面 思路 考场想到 \(tarjan\) 缩点 然而忘了缩点怎么打 于是甩了个暴力 改题时学了个圆方树 发现挺好用 于是······注意重边 \(Code\) #include<cstdio& ...

  4. 题解 P2602 [ZJOI2010] 数字计数

    虽然说是数位 dp 入门题但是还是不是很会(悲 看了题解才做出来,中途因为各种 SB 问题调了很长时间(悲 聪明的你一定能看出来这是数位 dp,因此令 \(i\) 为当前填的位数,\(limit\) ...

  5. python pip 升级失败解决方法

    今天花了一上午学习python,然后现在在研究做爬虫,结果发现python提示pip需要更高的版本,然后就研究了半天,解决方法如下: 一.检查版本: pip show pip 二.更新版本: pyth ...

  6. VueJs 监听 window.resize 方法---窗口变化

    mounted() { let _this = this; window.onresize = ()=>{ return (()=>{ this.vscreen.height=docume ...

  7. Java/.Net双平台核心,Jvm和CLR运行异同点

    前言: 本篇以.Net 7.0.2 CLR 和 OpenJDk19参照,解析下它们各自调用函数的异同. 以下为个人理解. 概述 JDK大约5.9G,CLR大约7.6G,两者相差1.7G左右. root ...

  8. CMakeLists.txt模板

    编译动态库的模板 add_library 生成可执行程序换成add_executable 不需要调试信息的去掉 -g 不需要警告信息的去掉 -Wall 这应该是 -W all的组合 cmake_min ...

  9. Shiro+SpringBoot前后端分离中跨域,sessionId,302问题

    1.解决跨域 @Configuration public class CorsConfig { public CorsConfiguration buildConfig() { CorsConfigu ...

  10. Java 8 在使用内存爆了以后会发生什么?hs_err_pid 日志如何看?

    问题: Java进程被终止了,然后在应用的目录中发现了hs_err_pid日志. 运维反馈,结论是内存不够了 之前一直运行没有问题,没什么新增访问量,为什么会内存溢出,进程被killer掉类? 1.第 ...