首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重用信号处理程序?

重用信号处理程序?
EN

Stack Overflow用户
提问于 2018-10-30 23:55:35
回答 1查看 75关注 0票数 2

在Vala中,有没有办法让多个信号处理程序执行相同的代码,同时它们可以访问本地作用域?

使用委托定义lambda是可行的,但需要委托定义,并给出警告“不支持复制委托”:

代码语言:javascript
运行
复制
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);
}

据我所知,也没有办法将信息传递给处理程序?类似于:

代码语言:javascript
运行
复制
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);
}

我可以这样做,但这需要很多额外的代码,特别是当有很多参数的时候。

代码语言:javascript
运行
复制
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);
}

有没有办法将多个信号连接到一个匿名函数?类似于:

代码语言:javascript
运行
复制
void test () {
 var answer = 42;

 multi_connect(size_changed, position_changed, () => {
   debug("size or position changed. answer: %i", answer);
 });
}
EN

回答 1

Stack Overflow用户

发布于 2018-10-31 00:30:50

使用this传递数据怎么样:

代码语言:javascript
运行
复制
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;
    }
}

也许有两个类会更具可读性:

代码语言:javascript
运行
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53068262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档