为什么Vala不能将信号连接到代表?

时间:2016-08-18 17:07:32

标签: delegates closures vala

我曾经认为委托的行为类似于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怎么还没有解决?

1 个答案:

答案 0 :(得分:3)

这确实是一个已知的错误:https://bugzilla.gnome.org/show_bug.cgi?id=604781

解决方法是使用闭包来调用它:

bar.bar_signal.connect( () => { bar_handler( i + 1 ); } );