決定學一門動態指令碼語言,感受一下不受拘的coding,發現比較流行的又不是只能用來寫網頁的有python,lua,ruby等。lua兼具運行效率高,表達能力強的優點,成了我的首選。更何況“月亮”聽起來要比“蟒蛇”和“紅寶石”文藝多了。
這是第一篇,但我不知道會不會寫第二篇。題目括弧裡的數字是1,因為lua裡的數組下標習慣上是從1開始的,當然從-1234開始也沒有錯,但不建議在一個團隊中使用,尤其團隊成員有暴力傾向的話。
原以為lua會比較好學一點,因為它小巧。現在知道錯了,lua不是那麼易學,因為小巧。經驗告訴我們,由一組簡單的規則衍生出複雜變化的事物,都不是好學的,儘管他們學起來都很有意思。
print"Hello world!"
這行代碼是lua的hello world程式,對比java的hello world就會感到lua的文法簡潔。下面的代碼也是可以的:
local say = print<br />say"Hello world!"
效果一樣。可以看出lua中的函數也是第一類值,可以像變數一樣賦值,傳作參數。但函數不是變數,而是匿名對象,isay和print都是對函數的引用。
local function say(s)<br /> print(s)<br />end</p><p>say"Hello world"
不要被上面那段的文法迷惑了,認為是個函式宣告——準確地說,是把匿名函數的引用賦值給say,上述的文法只是個文法糖,解譯器會被它翻譯成如下代碼:
local say<br />say = function(s)<br /><as before>
起初不喜歡這個文法糖,後來發現在處理遞迴時,這個文法糖還是很簡潔的,此處不表。
lua的設計目標之一在於更方便地表示資料,所以,表無處不在。
t = {1, 2, 3, a = 4, b = 5}<br />for k, v in pairs(t) do<br /> print(k, "=", v)<br />end
第一行是表的初始設定式,表也是匿名對象,t是它的引用。接著的迴圈遍曆了表中的元素。可以通過t[1]訪問到值1,也可通過t.a訪問到值4——這個表一部分是數組,一部分是字典。
其實程式的最外層也是一個表,它的引用是_G,t也是_G的一個鍵。
有個與表相關的語言特點,lua可以多值賦值。這可以帶來一些方便。
比如較換兩個數的值,普通程式員這麼寫:
void swap(int *const a, int *const b)<br />{<br /> int t = *a;<br /> *a = *b;<br /> *b = t;<br />}
文藝程式員:
void swap(int *const a, int *const b)<br />{<br /> *a ^= *b;<br /> *b ^= *a;<br /> *a ^= *b;<br />}
lua程式員:
a, b = b, a