欢迎光临散文网 会员登陆 & 注册

Vala 介绍

2022-12-26 13:00 作者:Superbart  | 我要投稿

本人博客链接:https://www.superbart.xyz/p/vala-introduction.html

Vala 是由 GNOME 小矮人开发的面向对象编程语言。编程语法接近 Java,围绕 GLib 库展开。编译方式是先翻译成 C 语言代码,然后编译。用途嘛……我来讲个故事吧。

我半年前学了 Dart,Google 开发的语言,编程语法接近 Javascript。官网说它是“多用途语言”,然而我感觉多数人学了它,就是为了用 Flutter :-P

Vala 也是这样,名义上是一个“多用途语言”,但是我感觉多数人学了它,只是为了 GTK。我也是不知道为啥,非得用这个语言写我的数据库大作业,花了两周时间边学边写,最后也不知道我学了个啥……

不得不说,GLib 是一个很强大的库。本来说是给 GTK 服务的,后来独立出去了。它实现了单/双向链表,变长数组,树,Map 等数据结构。它还以 GObject 为中心,构建了一个相当完善的,庞大的,让我这个菜鸡不知所以的类系统。

接下来大致介绍顺序:

  1. 基本输入输出(从键盘输入,从终端输出)

  2. 判断语句 if-else 和 switch

  3. 循环语句,包括计数和计事件循环

  4. 我一点都不懂的面向对象

  5. GLib 库和 Gee 库

  6. SQLite 3 库

推荐链接

先给大家推荐一些前人的经验教训:

  • 探索Vala语言 - 星外之神的博客 | wszqkzqk Blog

    https://wszqkzqk.github.io/2022/10/17/%E6%8E%A2%E7%B4%A2Vala%E8%AF%AD%E8%A8%80/

  • Valadoc.org (Vala 库文档网站)

    https://valadoc.org/index.htm

  • Projects/Vala/Documentation - GNOME Wiki! (官方文档)

    https://wiki.gnome.org/Projects/Vala/Documentation

基本输入输出

输出一句话,都是那德行:

输入一个数字:

输入字符串:

判断语句

if-else 判断:

swtich 判断:

省略,很少用到。

循环语句

计次数循环 for

计事件循环 while

面向对象特性

先说一句,我面向对象课学的一塌糊涂,如果想了解更多,请看官方介绍:Project/Vala/Tutorial#OOP

https://wiki.gnome.org/Projects/Vala/Tutorial#Object_Oriented_Programming

注意,Vala 基于 GLib,GLib 包含 GObject,GObject 仅支持单向继承。所以,跟 Java 一样,Vala 是单继承+接口。

从大家喜闻乐见的开始:

这个是我从网上抄的一段代码:


Gee

Gee 相当于 C++ 里面的 STL 。我对这个了解不多,先把官方的示例贴上来:Projects/Vala/GeeSamples - GNOME Wiki!

https://wiki.gnome.org/Projects/Vala/GeeSamples

实际上 GLib 已经实现了很多的数据结构,但我个人建议 Gee,功能比 Glib 本身有的更丰富,但是编程的时候需要添加 Gee 库。 

using Gee;

Glib 中,我有用过:

  • Array<类型>:变长数组

  • List<类型>:双向列表

Gee中,我有用过:

  • Set<类型>:无重复集合

  • HashMap<类型1,类型2>:哈希字典

具体用法请参阅相关文档和示例,链接给完了,我溜了~

迭代,匿名函数

首先是匿名函数,很简单:

(函数形参)=>{函数体语句}

(函数形参)=>一条语句

一般用于函数作形参的时候,临时写一个简单的。比如下面那个情况。

还有迭代,有些预先定义好的数据结构都支持迭代,使用的时候使用 foreach 方法就好。比如说:

异常处理和空值

先写出一个错误空间,说明这是啥大类的错误,里面可以细分。

写函数/方法的时候,可以加入 throws 关键字,注明会抛出啥错误。里面需要抛出错误的时候,使用 throw 语句抛出。下面是一个例子:

要捕捉抛出的错误,请使用 try-catch-finally 语句:

Vala 的变量可以设为空值,方法是加一个问号:

我个人认为,如果你不能确保方法确实能返回一个元素,可以使用这个。

当然,可以不用这么麻烦,这只是一个例子。

SQLite 3 库

SQLite 是一个库,实现了很完备的关系数据库。它将数据库存在一个文件里,使用的时候,调用 SQLite 库相应的函数,来对这个文件数据库进行基本操作。

这东西是一个 C 语言库。但 Vala 可以使用 C 库,它使用 vapi 文件来对应 C 的头文件。(实际上 Vala 也可以写 C 语言库,毕竟这玩意最后还是会变成 C 语言来编译。)

所以说,Vala 的 SQLite 库用起来应该和 C 语言的差不多。不过请注意,Vala 是面向对象的,而 SQLite 的库在引用到 Vala 的时候,做了面向对象的处理。

使用前,引用这个库:

using Sqlite;

数据库类

如此定义一个数据库对象:

Sqlite.Database m_db;

打开数据库:

Sqlite.Database.open_v2 (string path, out Sqlite.Database);

执行语句:

m_db.exec (string sql_exec);

数据库声明类

定义方式如下:

Sqlite.Statement add_flight;

准备声明:

绑定声明:

绑定依然有一系列的函数,此处只看绑定字符串

执行声明并清除绑定:

循环取出返回值:

如何速通一个编程语言

我当时是这么学的 C 语言:

  1. 基本输入输出

  2. 判断语句

  3. 循环语句

  4. 函数

  5. 数组

  6. 结构体

  7. 指针

前三条是说明这个语言大致的语法如何,因为编程思维的逻辑无非就那些:从哪里开始,需要那些材料,需要经过那些步骤,那些步骤得不断进行,这个步骤执行的条件是什么,这个步骤的结束条件是什么,最后的成果是如何的?逻辑搞明白了,接下来就是靠语言实现了。

接下来第四条,我认为是说明这个语言的性质。C 语言是面向过程的语言,所以主要是函数。而要是面向对象的话,教完函数之后,就是教你如何写一个类,如何搞继承之类的了。

剩下那三个,说明这个语言的数据结构。数据结构,有链表,栈,队列,字符串,树,图之类,还有集合,键值对字典这些常用的。这些东西给你了实现的工具,不过大多数语言已经实现了,比如 Java 。

最后,速通了语言,不代表所有。你得找到相对应的库。要是库很缺乏,或者根本没学的话,很有可能你啥都干不了。我暑假两天速通了  Javascript,然后我由于没学任何 Javascript 的库,比如 vue / react 啥的,我都不知道要用这个来干嘛:-P

最后,如有不完备或错误之处,敬请谅解。我还是水平不够啊:-(

Superbart 2022-12-20

Vala 介绍的评论 (共 条)

分享到微博请遵守国家法律