【发布时间】:2017-01-07 20:22:17
【问题描述】:
我曾经认为委托的行为类似于 Vala 中的方法引用。但是,我不明白为什么以下代码不起作用:
class Bar {
public signal void bar_signal();
}
class Foo : Object {
public Foo( int i, Bar bar ) {
bar.bar_signal.connect( bar_handler( i + 1 ) );
}
public delegate void Handler();
private static Handler bar_handler( int j ) {
return () =>
{
stdout.printf( "handler: %d\n", j );
};
}
}
public static void main( string[] args ) {
Bar bar = new Bar();
new Foo( 1, bar ); // will be finalized immediately
bar.bar_signal();
}
这段代码的习惯用法实际上在 JavaScript 中非常典型,它大量使用了闭包。可悲的是,valac 说:
Test.vala:8.33-8.45:错误:参数 1:无法从
Foo.Handler转换为Bar.bar_signal
一开始我以为这可能是因为下面的incompatibility of delegate types:
实例和静态委托实例不可互换。
但是,如果我将 static 放入委托的声明中,错误不会改变。
我在网上搜索过,但只发现了 2009 年的 an old mailing list entry,它说这是 Vala 中的一个错误。那正确吗?如果是这样:7 年后这个 bug 怎么还没有修复?
【问题讨论】: