加载中…
个人资料
步惊云
步惊云
  • 博客等级:
  • 博客积分:0
  • 博客访问:10,636
  • 关注人气:3
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

什么是匿名函数?

(2020-10-20 17:00:25)
标签:

匿名函数

分类: FMX$Datasnap
一、匿名函数是一种数据类型
这个有点像函数类型、过程类型,可以定义匿名函数类型。
implementation
{$R *.fmx}
type
  TFun = reference to function(const num: Integer): Integer; {用 reference 定义匿名方法类型}
二、匿名函数没有函数名,是一种嵌套函数,也是一个代码块
函数或过程就是一个代码块,你可以把一个代码块赋值给一个匿名函数变量。
procedure TForm1.Button1Click(Sender: TObject);
var
  fun: TFun;
  n: Integer;
begin
   //定义一个没有名字的函数来求平方,这个是函数里面再定义函数
  fun := function(const a: Integer): Integer {注意本行最后不能有 ; 号}
  begin
    Result := a * a;
  end;
  n := fun(9);
  ShowMessage(IntToStr(n)); {81}
  //再定义一个没有名字的函数来求倍数
  fun := function(const a: Integer): Integer
  begin
    Result := a + a;
  end;
  n := fun(9);
  ShowMessage(IntToStr(n)); {18}
end;
三、匿名函数可以用做其它函数的参数,或函数的返回值
匿名函数既然是数据类型,就可以放在表示数据类型的任何地方,包括函数体内。
implementation

{$R *.fmx}
//先定义一个匿名函数类型
type
  TFun = reference to function(const num: Integer): Integer; {用 reference 定义匿名方法类型}
//再定义一个有匿名函数作为参数的函数
function FunTest(const n: Integer; fun: TFun): string;
  begin
    Result :=IntTostr(Fun(n));
  end;
procedure TForm1.Button2Click(Sender: TObject);
var
  f: TFun;
  s: string;
begin
  f := function(const a: Integer): Integer {注意本行最后不能有 ; 号}
  begin
    Result := a * a;
  end;
  s := FunTest(10, f);
  ShowMessage(s); {9, 81}
end;
//或者直接把匿名函数块传给函数的参数,即在调用时直接写函数
procedure TForm1.Button3Click(Sender: TObject);
var
  s:string;
begin
  ShowMessage(
  FunTest(10, function(const a: Integer): Integer
  begin
    Result := a * a;
  end)
  );
end;
四、匿名函数的用处
匿名函数主要用做闭包,在javascript中使用广泛,在delphi中使用不多,特别是vcl中,但在FMX中,有时会遇到。例如,在android中模拟模式对话框。
procedure TForm1.Button3Click(Sender: TObject);
var
   AFDJSONDelta: TFDJSONDeltas;
begin
 TDialogServiceAsync.MessageDialog
    (
      '真的删除记录吗?', TMsgDlgType.mtInformation,
      [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo,TMsgDlgBtn.mbCancel],
      TMsgDlgBtn.mbYes, 0,
      procedure(const AResult: TModalResult)
      begin
        if AResult=mrYes then
        begin
          FDMemTable2.Open;
          FDMemTable2.Delete;
          AFDJSONDelta:= TFDJSONDeltas.Create;
          TFDJSONDeltasWriter.ListAdd(AFDJSONDelta, FDMemTable2);
          ClientModule1.ServerMethods1Client.UpdateTable('tbtest',AFDJSONDelta);
            Form1.Button4Click(Sender);
          showmessage('记录删除了');
        end
        else if AResult=mrNo then
        begin
          showmessage('没有删除任何记录');
        end
      end
    );
end;
这里,TDialogServiceAsync.MessageDialog函数的最后一个参数,是一个匿名方法类型,调用DialogServiceAsync.MessageDialog时,直接把匿名方法块写在参数的位置,会等到该匿名方法调用返回后才最后完成MessageDialog的调用。
可以参考万一的https://www.cnblogs.com/del/archive/2008/08/15/1268301.html

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有