【问题标题】:Higher order Procedures in delphidelphi中的高阶程序
【发布时间】:2020-08-22 06:50:41
【问题描述】:

我试图将一个过程作为另一个过程的参数引用,但无法理解文档。(http://docwiki.embarcadero.com/RADStudio/Sydney/en/Procedural_Types_(Delphi))

据我了解,我需要为该过程创建一个新类型..

type
  TCallback = procedure of object;

并将高阶过程声明为 procedure HigherOrder(pProc: TCallback);

尝试调用函数时(单击按钮时)收到编译错误“E2010 Incompatible types: 'TCallBack' and 'procedure, untyped pointer or untyped parameter'”

type
  TCallBack = procedure of object;
  TfrmMain = class(TForm)
    btnAct: TButton;
    procedure btnActClick(Sender: TObject);
  private
    procedure HigherOrder(pProc: TCallback);
    procedure Callback();
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

{ TfrmMain }

procedure TfrmMain.btnActClick(Sender: TObject);
begin
  HigherOrder(Callback()); <--Error occurs here
end;

procedure TfrmMain.Callback;
begin
  //Do some stuff
end;

procedure TfrmMain.HigherOrder(pProc: TCallback);
begin
  //Do some other stuff
  pProc();
end;

end.

非常感谢任何帮助。我对 delphi 编程很陌生。

【问题讨论】:

    标签: delphi pascal


    【解决方案1】:

    问题是您首先调用 Callback(),然后尝试将其返回值(它没有返回值)传递给HigherOrder() ,但这不是HigherOrder() 所期望的,这就是您收到错误的原因。换句话说,您的代码大致相当于

    procedure TfrmMain.btnActClick(Sender: TObject);
    begin
      //HigherOrder(Callback());
      var res := Callback();
      HigherOrder(res);
    end;
    

    除了res 的类型是未定义,因为Callback()procedure 而不是function

    当调用HigherOrder() 时,您需要从Callback() 中删除尾部的() 括号,以便将Callback 本身(好吧,它的内存地址,无论如何)作为值传递pProc 参数,如:

    procedure TfrmMain.btnActClick(Sender: TObject);
    begin
      HigherOrder(Callback);
    end;
    

    是的,您也可以在调用过程时去掉括号而不传递任何参数。但是,在这种情况下,编译器足够聪明,可以知道省略括号的Callback 标识符被分配给闭包类型,因此按原样传递而不是调用它

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多