Vala 介紹
本人博客鏈接:https://www.superbart.xyz/p/vala-introduction.html
Vala 是由 GNOME 小矮人開發(fā)的面向?qū)ο缶幊陶Z言。編程語法接近 Java,圍繞 GLib 庫展開。編譯方式是先翻譯成 C 語言代碼,然后編譯。用途嘛……我來講個(gè)故事吧。
我半年前學(xué)了 Dart,Google 開發(fā)的語言,編程語法接近 Javascript。官網(wǎng)說它是“多用途語言”,然而我感覺多數(shù)人學(xué)了它,就是為了用 Flutter :-P
Vala 也是這樣,名義上是一個(gè)“多用途語言”,但是我感覺多數(shù)人學(xué)了它,只是為了 GTK。我也是不知道為啥,非得用這個(gè)語言寫我的數(shù)據(jù)庫大作業(yè),花了兩周時(shí)間邊學(xué)邊寫,最后也不知道我學(xué)了個(gè)啥……
不得不說,GLib 是一個(gè)很強(qiáng)大的庫。本來說是給 GTK 服務(wù)的,后來獨(dú)立出去了。它實(shí)現(xiàn)了單/雙向鏈表,變長數(shù)組,樹,Map 等數(shù)據(jù)結(jié)構(gòu)。它還以 GObject 為中心,構(gòu)建了一個(gè)相當(dāng)完善的,龐大的,讓我這個(gè)菜雞不知所以的類系統(tǒng)。
接下來大致介紹順序:
基本輸入輸出(從鍵盤輸入,從終端輸出)
判斷語句 if-else 和 switch
循環(huán)語句,包括計(jì)數(shù)和計(jì)事件循環(huán)
我一點(diǎn)都不懂的面向?qū)ο?/p>
GLib 庫和 Gee 庫
SQLite 3 庫
推薦鏈接
先給大家推薦一些前人的經(jīng)驗(yàn)教訓(xùn):
探索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 庫文檔網(wǎng)站)
https://valadoc.org/index.htm
Projects/Vala/Documentation - GNOME Wiki! (官方文檔)
https://wiki.gnome.org/Projects/Vala/Documentation
基本輸入輸出
輸出一句話,都是那德行:
輸入一個(gè)數(shù)字:
輸入字符串:
判斷語句
if-else 判斷:
swtich 判斷:
省略,很少用到。
循環(huán)語句
計(jì)次數(shù)循環(huán) for
計(jì)事件循環(huán) while
面向?qū)ο筇匦?/p>
先說一句,我面向?qū)ο笳n學(xué)的一塌糊涂,如果想了解更多,請看官方介紹:Project/Vala/Tutorial#OOP
https://wiki.gnome.org/Projects/Vala/Tutorial#Object_Oriented_Programming
注意,Vala 基于 GLib,GLib 包含 GObject,GObject 僅支持單向繼承。所以,跟 Java 一樣,Vala 是單繼承+接口。
從大家喜聞樂見的開始:
這個(gè)是我從網(wǎng)上抄的一段代碼:
Gee
Gee 相當(dāng)于 C++ 里面的 STL 。我對這個(gè)了解不多,先把官方的示例貼上來:Projects/Vala/GeeSamples - GNOME Wiki!
https://wiki.gnome.org/Projects/Vala/GeeSamples
實(shí)際上 GLib 已經(jīng)實(shí)現(xiàn)了很多的數(shù)據(jù)結(jié)構(gòu),但我個(gè)人建議 Gee,功能比 Glib 本身有的更豐富,但是編程的時(shí)候需要添加 Gee 庫。?
using Gee;
Glib 中,我有用過:
Array<類型>:變長數(shù)組
List<類型>:雙向列表
Gee中,我有用過:
Set<類型>:無重復(fù)集合
HashMap<類型1,類型2>:哈希字典
具體用法請參閱相關(guān)文檔和示例,鏈接給完了,我溜了~
迭代,匿名函數(shù)
首先是匿名函數(shù),很簡單:
(函數(shù)形參)=>{函數(shù)體語句}
(函數(shù)形參)=>一條語句
一般用于函數(shù)作形參的時(shí)候,臨時(shí)寫一個(gè)簡單的。比如下面那個(gè)情況。
還有迭代,有些預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)都支持迭代,使用的時(shí)候使用 foreach
方法就好。比如說:
異常處理和空值
先寫出一個(gè)錯(cuò)誤空間,說明這是啥大類的錯(cuò)誤,里面可以細(xì)分。
寫函數(shù)/方法的時(shí)候,可以加入 throws
關(guān)鍵字,注明會(huì)拋出啥錯(cuò)誤。里面需要拋出錯(cuò)誤的時(shí)候,使用 throw
語句拋出。下面是一個(gè)例子:
要捕捉拋出的錯(cuò)誤,請使用 try-catch-finally 語句:
Vala 的變量可以設(shè)為空值,方法是加一個(gè)問號:
我個(gè)人認(rèn)為,如果你不能確保方法確實(shí)能返回一個(gè)元素,可以使用這個(gè)。
當(dāng)然,可以不用這么麻煩,這只是一個(gè)例子。
SQLite 3 庫
SQLite 是一個(gè)庫,實(shí)現(xiàn)了很完備的關(guān)系數(shù)據(jù)庫。它將數(shù)據(jù)庫存在一個(gè)文件里,使用的時(shí)候,調(diào)用 SQLite 庫相應(yīng)的函數(shù),來對這個(gè)文件數(shù)據(jù)庫進(jìn)行基本操作。
這東西是一個(gè) C 語言庫。但 Vala 可以使用 C 庫,它使用 vapi 文件來對應(yīng) C 的頭文件。(實(shí)際上 Vala 也可以寫 C 語言庫,畢竟這玩意最后還是會(huì)變成 C 語言來編譯。)
所以說,Vala 的 SQLite 庫用起來應(yīng)該和 C 語言的差不多。不過請注意,Vala 是面向?qū)ο蟮?,?SQLite 的庫在引用到 Vala 的時(shí)候,做了面向?qū)ο蟮奶幚怼?/p>
使用前,引用這個(gè)庫:
using Sqlite;
數(shù)據(jù)庫類
如此定義一個(gè)數(shù)據(jù)庫對象:
Sqlite.Database m_db;
打開數(shù)據(jù)庫:
Sqlite.Database.open_v2 (string path, out Sqlite.Database);
執(zhí)行語句:
m_db.exec (string sql_exec);
數(shù)據(jù)庫聲明類
定義方式如下:
Sqlite.Statement add_flight;
準(zhǔn)備聲明:
綁定聲明:
綁定依然有一系列的函數(shù),此處只看綁定字符串
執(zhí)行聲明并清除綁定:
循環(huán)取出返回值:
如何速通一個(gè)編程語言
我當(dāng)時(shí)是這么學(xué)的 C 語言:
基本輸入輸出
判斷語句
循環(huán)語句
函數(shù)
數(shù)組
結(jié)構(gòu)體
指針
前三條是說明這個(gè)語言大致的語法如何,因?yàn)榫幊趟季S的邏輯無非就那些:從哪里開始,需要那些材料,需要經(jīng)過那些步驟,那些步驟得不斷進(jìn)行,這個(gè)步驟執(zhí)行的條件是什么,這個(gè)步驟的結(jié)束條件是什么,最后的成果是如何的?邏輯搞明白了,接下來就是靠語言實(shí)現(xiàn)了。
接下來第四條,我認(rèn)為是說明這個(gè)語言的性質(zhì)。C 語言是面向過程的語言,所以主要是函數(shù)。而要是面向?qū)ο蟮脑?,教完函?shù)之后,就是教你如何寫一個(gè)類,如何搞繼承之類的了。
剩下那三個(gè),說明這個(gè)語言的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu),有鏈表,棧,隊(duì)列,字符串,樹,圖之類,還有集合,鍵值對字典這些常用的。這些東西給你了實(shí)現(xiàn)的工具,不過大多數(shù)語言已經(jīng)實(shí)現(xiàn)了,比如 Java 。
最后,速通了語言,不代表所有。你得找到相對應(yīng)的庫。要是庫很缺乏,或者根本沒學(xué)的話,很有可能你啥都干不了。我暑假兩天速通了 ?Javascript,然后我由于沒學(xué)任何 Javascript 的庫,比如 vue / react 啥的,我都不知道要用這個(gè)來干嘛:-P
最后,如有不完備或錯(cuò)誤之處,敬請諒解。我還是水平不夠啊:-(
Superbart 2022-12-20