function - 如何将另一个函数返回的函数分配给函数变量?结果而不是生成函数本身

标签 function delphi variables function-pointers anonymous-methods

函数正在返回匿名函数。我想将结果分配给一个变量。然而编译器认为我正在尝试分配函数而不是函数的结果。我该如何解决这个问题?

program Project9;

{$APPTYPE CONSOLE}

type
  TMyEvent = reference to function: string;

var
  v1: TMyEvent;

function GetHandler: TMyEvent;
begin
  Result := function: string
            begin
              Result := '';
            end;
end;

begin
  v1 := GetHandler;  // <- Incompatible types: 'TMyEvent' and 'Procedure'
end.

注意:我确实有一个解决方法,但我希望可以在不引入包装器的情况下解决这个问题:

program Project9;

{$APPTYPE CONSOLE}

type
  TMyEvent = reference to function: string;

  TWrapper = record
    FHandler: TMyEvent;
  end;

var
  v1: TMyEvent;

function GetHandler: TWrapper;
begin
  Result.FHandler := function: string
                     begin
                       Result := '';
                     end;
end;

begin
  v1 := GetHandler.FHandler;  // <- works

编辑:这并不特定于匿名或任何特殊类型的函数:这​​对于任何返回该函数的函数都是实际的,甚至在第一个 Delphi 到来之前,在 Turbo Pascal 中也是如此。

最佳答案

如果您的匿名方法/函数是无参数的,则必须使用 () 进行赋值;

v1 := GetHandler();

如果没有括号,Delphi 将尝试将函数分配给变量。括号告诉它调用函数并将函数结果分配给变量。

关于function - 如何将另一个函数返回的函数分配给函数变量?结果而不是生成函数本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245977/

相关文章:

python - 在 python 中,函数应该更改列表还是制作副本并返回?

delphi - 如何将 OpenCV 与 Delphi 的 Unicode 版本一起使用?

python2.7 - 从字典中获取值,其中键是变量

java - 在 Java 中从变量声明新类

C++ 实现不使用全局声明的函数

c++ - 如何从整个代码的函数中打开文件?

multithreading - 如果主线程拥有一个临界区,那么尝试获取该临界区的函数是否会阻塞(如果它也在主线程上)?

delphi - 从 Delphi DLL 导出全局符号

Java使用一个变量作为另一个变量

list - 方案/ Racket 中的功能和列表