当前位置: 首页 > news >正文

Vala编程语言教程-信号

信号


        信号是 GLib 中 Object 类提供的系统,Vala 让所有 Object 的后代类都能轻松使用信号。C# 程序员可以将信号理解为事件(event),Java 程序员则可以将其视为实现事件监听器的另一种方式。简而言之,信号就是一种能在近乎同一时刻执行任意数量外部形式相同(即具有相同签名)的方法的机制。具体的执行方法在 gobject 内部实现,Vala 程序无需关心其细节。

        信号被定义为类的成员,形式上类似于没有方法体的方法。可以通过 connect() 方法为信号添加处理器。为了深入理解,以下示例还引入了 lambda 表达式——在 Vala 中编写信号处理代码时非常有用的一种方式:

public class Test : GLib.Object {

    public signal void sig_1(int a);

    public static int main(string[] args) {
        Test t1 = new Test();

        t1.sig_1.connect((t, a) => {
            stdout.printf("%d\n", a);
        });

        t1.sig_1(5);

        return 0;
    }
}

运行结果:

5

        这段代码使用熟悉的语法定义了一个名为 "Test" 的新类。类的第一个成员是名为 "sig_1" 的信号,定义时会传递一个整数。在程序的 main 方法中,我们首先创建 Test 实例(信号必须依附于类的实例)。接着我们为实例的 "sig_1" 信号分配了一个处理器,使用 lambda 表达式内联定义。定义声明该方法将接收两个参数 "t" 和 "a",但没有指定类型——这种简洁写法之所以可行,是因为 Vala 已知晓信号的定义,能自动推断所需类型。

        处理器需要两个参数的原因是:每当信号被触发时,触发该信号的对象会作为第一个参数传递给处理器。第二个参数则是信号声明时要提供的参数。

        最后我们通过像调用类方法一样调用信号来触发它,gobject 会负责将消息转发给所有已连接的处理器。Vala 使用者无需了解其底层机制。

        注意:目前 public 访问修饰符是唯一可用的选项,所有信号都可以被任意代码连接和触发。

信号可以使用任意组合的标志进行注解:

[Signal (action=true, detailed=true, run=true, no_recurse=true, no_hooks=true)]
public signal void sig_1 ();


更多示例参见 Projects/Vala/SignalsAndCallbacks – GNOME Wiki Archive。

相关文章:

  • CSS 实现滚动条的隐藏但保留滚动功能
  • Python列表生成式
  • 联合体(Union)的使用与应用场景
  • 【解决】Visual Studio 无法中文输入问题
  • 集成电容器降低换向环电感
  • 李想官宣开源整车操作系统
  • 【机器学习】——机器学习基础概念
  • Redis 中的热点键和数据倾斜
  • 行星际激波特征分析及其在太阳风激波自动检测算法开发与优化中的应用
  • 《深度剖析SQL数据类型转换:隐式与显式的奥秘》
  • 超简单:Linux下opencv-gpu配置
  • 什么是 JavaScript 中的原型链(Prototype Chain)?
  • Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(五)
  • 北理工计算机考研复试上机2012年真题
  • 场馆预约小程序的设计与实现
  • 02 相机标定相关坐标系
  • greenhill编译出现:3201原因错误
  • 视频管理平台-信息泄露漏洞
  • 027-7zsfx
  • pom.xml与.yml,java配置参数传递
  • 商业网站建设平台/设计网站大全
  • 做网站运营有前景么/搜索引擎营销的方法包括
  • 建筑网建筑规范大全/软件排名优化
  • 制作网页怎样添加背景音乐/优化seo公司哪家好
  • 陕西宝鸡网站建设/域名注册网
  • 武汉模板网站建设/网络推广的方法