信号的返回类型如何在Vala中工作?

时间:2018-04-13 13:45:50

标签: signals-slots return-type vala

在Vala中,我可以写一个这样的类:

class Foo {
    public signal int foo();
}

其中信号的返回类型是非空的。这是如何运作的?如果没有听众或多个听众连接到信号,信号发射的结果是什么?我似乎无法找到相关文档。

1 个答案:

答案 0 :(得分:0)

Vala将继承how GObject handles such a situation

  

请注意,g_signal_emit() [和大多数其他发射方法]如果没有连接处理程序,则将返回值重置为默认值,而g_signal_emitv() [通过输出GValue并且在这种情况下只留下它]

您可以看到该文档的{Vora} here。用some_foo.foo()发出信号最终将委托给那个,因为测试将显示:

class Foo
{
  public signal int foo();
}

public static int
main(string[] args)
{
  Foo foo = new Foo();
  // foo.foo.connect( () => { return 42; } );
  int result = foo.foo();
  return result;
}

如果调用.connect()的行已被注释掉,则result为0,这是GValue持有int的默认值。

对于零处理程序的情况。对于倍数,如stunningpotato indicated,返回值通常是被调用的最后一个信号处理程序的结果:

  

如果没有提供累加器函数,最后一个处理程序运行返回的值将由g_signal_emit返回。

而且,除了对象提供的处理程序,您可以控制最后一个:

  

用户提供的信号处理程序按其连接顺序调用。

正如这些文档中的第一篇所述,您可以通过自定义累加器来决定多个处理程序的结果会发生什么,以处理更复杂的级联。