匿名方法转换为指针

发布于 2024-08-23 04:49:31 字数 511 浏览 5 评论 0原文

谁能解释为什么下面的代码失败?

type TIDEThemeObserverFunc = reference to procedure(foo: integer);
var fObserverFuncs: TList<TIDEThemeObserverFunc>

function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer;
begin
  fObserverFuncs.Add(aObserverFunc);
  Result := @aObserverFunc;

  // line below somehow fails
  assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result)) <> -1);
end;

我假设匿名方法可以简单地通过指针进行转换和使用,但这似乎是一个错误的假设。此外,任何解释匿名方法在幕后如何实现的资源都会很棒。 TIA。

can anyone explain why the code below fails?

type TIDEThemeObserverFunc = reference to procedure(foo: integer);
var fObserverFuncs: TList<TIDEThemeObserverFunc>

function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer;
begin
  fObserverFuncs.Add(aObserverFunc);
  Result := @aObserverFunc;

  // line below somehow fails
  assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result)) <> -1);
end;

I assumed anonymous methods can simply be casted and used around via pointers but that seems like a wrong assumption. Also, any resources explaining how the anonymous methods are implemented under the hood would be great. TIA.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

醉生梦死 2024-08-30 04:49:31

您应该使用 PPointer(@aObserverFunc)^ 而不是 @aObserverFunc 以避免断言失败。

@gabr:感谢您对我的博客的引用,但我建议首先阅读 Stackoverflow 用户 Barry Kelly 博客作为更有效的信息来源。

You should use PPointer(@aObserverFunc)^ instead of @aObserverFunc to avoid the failed assert.

@gabr: thanks for ref to my blog, but I should recommend first to read the Stackoverflow user Barry Kelly blog as a more competent source of information.

稀香 2024-08-30 04:49:31

匿名方法实际上是接口(更正确的是实现接口的对象)。

在这里阅读更多内容: Delphi 中的匿名方法:内部结构(由 Stackoverflow 用户 Serg 编写)。

Anonymous methods are actually interfaces (more correct - objects implementing an interface).

Read more here: Anonymous methods in Delphi: the internals (written by Stackoverflow user Serg).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文