我曾经认为委托的行为类似于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怎么还没有解决?
答案 0 :(得分:3)
这确实是一个已知的错误:https://bugzilla.gnome.org/show_bug.cgi?id=604781
解决方法是使用闭包来调用它:
bar.bar_signal.connect( () => { bar_handler( i + 1 ); } );