在Vala中,有没有办法让多个信号处理程序执行相同的代码,同时它们可以访问本地作用域?
使用委托定义lambda是可行的,但需要委托定义,并给出警告“不支持复制委托”:
delegate void ChangeHandler ();
void test () {
 var answer = 42;
 ChangeHandler handler = () => {
   debug("size or position changed. answer: %i", answer);
 };
 size_changed.connect (handler);
 position_changed.connect (handler);
}据我所知,也没有办法将信息传递给处理程序?类似于:
void test () {
 var answer = 42;
 size_changed.connect (handler, answer);
 position_changed.connect (handler, answer);
}
void handler (answer) {
 debug("size or position changed. answer: %i", answer);
}我可以这样做,但这需要很多额外的代码,特别是当有很多参数的时候。
void test () {
 var answer = 42;
 size_changed.connect (handler, answer);
 position_changed.connect (() => handler(answer));
}
void handler (answer) {
 debug("size or position changed. answer: %i", answer);
}有没有办法将多个信号连接到一个匿名函数?类似于:
void test () {
 var answer = 42;
 multi_connect(size_changed, position_changed, () => {
   debug("size or position changed. answer: %i", answer);
 });
}发布于 2018-10-31 00:30:50
使用this传递数据怎么样:
public class Test : GLib.Object {
    public signal void sig_1 ();
    public signal void sig_2 ();
    private int answer = 42;
    private void sig_handler (Test t) {
        stdout.printf("sig_1 or sig_2 triggered. answer: %d\n", answer);
    }
    public static int main(string[] args) {
        Test t1 = new Test();
        t1.sig_1.connect(t1.sig_handler);
        t1.sig_2.connect(t1.sig_handler);
        t1.sig_1();
        t1.sig_2();
        return 0;
    }
}也许有两个类会更具可读性:
public class SignalRaiser : GLib.Object {
    public signal void sig_1 ();
    public signal void sig_2 ();
}
public class SignalReceiver : GLib.Object {
    private int answer = 42;
    public void sig_handler (SignalRaiser sender) {
        stdout.printf("sig_1 or sig_2 triggered. answer: %d\n", answer);
    }
}
int main(string[] args) {
    var raiser = new SignalRaiser();
    var receiver = new SignalReceiver();
    raiser.sig_1.connect(receiver.sig_handler);
    raiser.sig_2.connect(receiver.sig_handler);
    raiser.sig_1();
    raiser.sig_2();
    return 0;
}https://stackoverflow.com/questions/53068262
复制相似问题