在Vala中,我可以写一个这样的类:
class Foo {
public signal int foo();
}
其中信号的返回类型是非空的。这是如何运作的?如果没有听众或多个听众连接到信号,信号发射的结果是什么?我似乎无法找到相关文档。
答案 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
返回。
而且,除了对象提供的处理程序,您可以控制最后一个:
用户提供的信号处理程序按其连接顺序调用。
正如这些文档中的第一篇所述,您可以通过自定义累加器来决定多个处理程序的结果会发生什么,以处理更复杂的级联。