Vala 介绍
本人博客链接:https://www.superbart.xyz/p/vala-introduction.html
Vala 是由 GNOME 小矮人开发的面向对象编程语言。编程语法接近 Java,围绕 GLib 库展开。编译方式是先翻译成 C 语言代码,然后编译。用途嘛……我来讲个故事吧。
我半年前学了 Dart,Google 开发的语言,编程语法接近 Javascript。官网说它是“多用途语言”,然而我感觉多数人学了它,就是为了用 Flutter :-P
Vala 也是这样,名义上是一个“多用途语言”,但是我感觉多数人学了它,只是为了 GTK。我也是不知道为啥,非得用这个语言写我的数据库大作业,花了两周时间边学边写,最后也不知道我学了个啥……
不得不说,GLib 是一个很强大的库。本来说是给 GTK 服务的,后来独立出去了。它实现了单/双向链表,变长数组,树,Map 等数据结构。它还以 GObject 为中心,构建了一个相当完善的,庞大的,让我这个菜鸡不知所以的类系统。
接下来大致介绍顺序:
基本输入输出(从键盘输入,从终端输出)
判断语句 if-else 和 switch
循环语句,包括计数和计事件循环
我一点都不懂的面向对象
GLib 库和 Gee 库
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 语言:
基本输入输出
判断语句
循环语句
函数
数组
结构体
指针
前三条是说明这个语言大致的语法如何,因为编程思维的逻辑无非就那些:从哪里开始,需要那些材料,需要经过那些步骤,那些步骤得不断进行,这个步骤执行的条件是什么,这个步骤的结束条件是什么,最后的成果是如何的?逻辑搞明白了,接下来就是靠语言实现了。
接下来第四条,我认为是说明这个语言的性质。C 语言是面向过程的语言,所以主要是函数。而要是面向对象的话,教完函数之后,就是教你如何写一个类,如何搞继承之类的了。
剩下那三个,说明这个语言的数据结构。数据结构,有链表,栈,队列,字符串,树,图之类,还有集合,键值对字典这些常用的。这些东西给你了实现的工具,不过大多数语言已经实现了,比如 Java 。
最后,速通了语言,不代表所有。你得找到相对应的库。要是库很缺乏,或者根本没学的话,很有可能你啥都干不了。我暑假两天速通了 Javascript,然后我由于没学任何 Javascript 的库,比如 vue / react 啥的,我都不知道要用这个来干嘛:-P
最后,如有不完备或错误之处,敬请谅解。我还是水平不够啊:-(
Superbart 2022-12-20