如何调整 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() {
...
}
}
这不会捕获对此的引用,但您也无法捕获任何其他变量。
如何在匿名函数中弱捕获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() {
...
}
}
这不会捕获对此的引用,但您也无法捕获任何其他变量。