【问题标题】:Why can't Vala connect signals to delegates?为什么 Vala 不能将信号连接到代表?
【发布时间】: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 怎么还没有修复?

【问题讨论】:

    标签: delegates closures vala


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多