如何调整 Vala 中的 Lambda 表达式捕获的变量?

How to tweak the variables, which a Lambda expression in Vala captures?

如何在匿名函数中弱捕获this

我在文档中找不到任何关于是否(或如何)可以调整匿名函数/lambda 表达式捕获的变量的信息。问题是这些函数似乎从堆栈帧中捕获所有变量,它们是在其中创建的,至少在默认情况下是这样。特别是,它们总是捕获 this,这在将它们用于信号处理程序时会出现问题,因为处理程序随后会变成对 this 的硬引用,可能会导致引用循环。

Vala 是否有一些机制来防止 lambda 捕获 this 的硬引用?目前,我正在为每个信号处理程序创建一个新的 class,例如 A.Handler,其中我只对我需要的 A 的实际 this 保持弱引用来自处理程序内部的引用,但我认为这破坏了 lambda 表达式的好处。

在 lambda 内部,不。标准方法是这样的:

class Foo : Whatever {

  public Foo {
    unowned Foo unowned_this = this;
    this.bar_signal.connect(unowned_this.bar_handler);
  }
  private void bar_handler() {
    ...
  }
}

这不会捕获对此的引用,但您也无法捕获任何其他变量。