首页 > 其他分享 >Delphi 新语法:匿名函数

Delphi 新语法:匿名函数

时间:2022-09-08 09:56:15浏览次数:66  
标签:intSum end Delphi begin 语法 匿名 lResult Integer Calc

这里的新语法一般指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的值是会保存下来供下次使用的.就像全局变量一般.

标签:intSum,end,Delphi,begin,语法,匿名,lResult,Integer,Calc
From: https://www.cnblogs.com/YXGust/p/16663364.html

相关文章

  • Delphi 经典游戏程序设计40例 的学习 例27 残留的轨迹是抛物线
     unitR27;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,StdCtrls;typeTRei27=cl......
  • JS: 模拟async/await语法糖
    不熟悉生成器对象的小伙伴,可查看:Generator、Generator.prototype.next模拟函数:/***模拟async关键字的函数*(不返回Promise对象也是可以的)*@paramgenerator*......
  • Python简洁语法笔记
    defaultdict需要构造类似{k1:{v11,v12,v13,...},k2:{v21,v22,v23,...},...}结构的数据时,可以用collections.defaultdict:fromcollectionsimportdefaultdict......
  • python3基础语法2
    Python3.0在设计的时候没有考虑向下兼容。官方宣布,2020年1月1日,停止Python2的更新。编码默认情况下,Python3源码文件以 UTF-8 编码,所有字符串都是unico......
  • 小程序 : wxs语法基本使用 -- 类似于过滤器
    第一步,创建wxs并导出functionformatPrice(price){return"¥"+price}functioncalcPrice(books){return"¥"+books.reduce(function(preValue,item)......
  • 小程序 : mustache语法 和 条件渲染 和 列表渲染
    <!--pages/04_learn_wxml/index.wxml--><h1>Mustache语法</h1><view>{{message}}</view><view>{{firstname+""+lastname}}</view><view>{{date}}</view>......
  • 模板语法之继承
    什么是模板继承模板继承就是指可以使父模板的内容重用,子模板直接继承父模板的全部内容,并可以覆盖父模板中相应的块继承的语法父模板中:1.用block标签标识中哪些在子模板......
  • 模板语法之标签
    语法{%开始标签%}....{%结束标签%}if标签例:{%if...%}{%elif%}{%else%}{%endif%}if语句支持and、or、==、>、<、!=、<=、>=、in、notin、is、isn......
  • delphi TcxGrid网格组件:用CxGrid制作卡片视图
    一.删除cxGrid1DBTableView视图.TcxGrid在创建时,会自动添加一个cxGrid1DBTableView1视图,我们需要删除它 二.创建卡片视图. 三.链接数据库.......
  • 模板语法之过滤器
    过滤器的作用用来修改变量的输出结果语法{{变量名|过滤器1:'参数值1’|过滤器2:'参数值2}}<h1>过滤器</h1><p>统计长度:{{s|length}}</p><p>默认值(第一个参数b布尔......