Lua 值得學習嗎?
Lua 是一個有趣而強大的語言,隨著各個版本的推進,功能愈發的強大,開發者群體也在不斷的增長。這篇文章我們將探索一下它的各種前景。
Lua 是一個腳本語言,它面向過程、函數式編程,甚至可以是 面向對象的。它使用類 C 語言的語法,但卻是動態類型,具有自動內存管理和垃圾回收功能,使用基於寄存器的虛擬機來解釋位元組碼。這些特點使得它對於初學者來說是個很好的語言,同時也是經驗豐富的程序員的強大工具。
雖然與 Python 和 JavaScript 相比,Lua 現在已經有點兒黯然失色了,但是 Lua 擁有的一些優點使得它在許多的重大軟體項目中很受歡迎。Lua 很容易嵌入到其他語言當中, 這意味著你可以在(例如)Java 編寫的代碼中包含 Lua 文件,就像原生的 Java 代碼一樣運行。這聽起來就像魔法一般,現在有許多項目如 luaj 使得其成為可能,之所以可以實現,正是因為 Lua 就是為此而設計的。部分出於這種靈活性,你可以在許多遊戲、圖形應用的程序中發現 Lua 腳本的身影。
就像其他任何事情一樣,做到完美是需要時間的,但 Lua 是很易於學習(並且有趣)的語言。它是一種一致的語言、一種帶有有用的錯誤消息的友好的語言,並且可以在網上輕鬆找到許多有用的資料。那麼就讓我們開始吧!
安裝 Lua
在 Linux 下,你可以使用發行版自帶的包管理來安裝 Lua。例如,在 Fedora、CentOS、 Mageia、OpenMandriva 以及類似發行版中:
$ sudo dnf install lua
在 Debian 以及基於 Debian 的系統中:
$ sudo apt install lua
對於 Mac,你可以使用 MacPorts 或者 Homebrew:
$ sudo port install lua
對於 Windows,可以使用 Chocolatey 安裝 Lua。
完成安裝後,可以在終端中輸入 lua
來在互動式解釋器中使用 Lua。
函數
如許多編程語言一樣,Lua 的語法通常是一個內建的函數或關鍵字,後面跟著參數。例如,print
函數顯示你傳給它的所有參數。
$ lua
Lua 5.4.2 Copyright (C) 1994-2020 Lua.org,PUC-Rio
> print('hello')
hello
Lua 的 string
庫可以操作單詞(在編程中稱為「字元串」)。例如,要統計字元串中的字母數量,你可以使用 string
庫中 len
函數:
> string.len('hello')
5
變數
變數允許你在計算機內存中為臨時的數據創建一個指定的空間。Lua 中創建變數的方法是賦予變數一個名字,接著將數據放入其中。
> foo = "hello world"
> print(foo)
hello world
> bar = 1+2
> print(bar)
3
表
在編程中,數組的使用頻率僅次於變數。「數組」這個詞的字面意思就是一種排列,而這就是程序中數組的意義了。它是數據的一種排列,因為有排列,所有數組具有結構化的優勢。本質上,數組通常用於和變數相同的目的,只不過數組會給對其中的數據進行排序。在 Lua 中,數組被稱為「表」。(LCTT 譯註:使用過其它編程語言的同學可以發現,Lua 的表相當於其它語言中的關聯數組、哈希。)
創建表和創建變數類似,區別僅在於它的初始化內容被設置為 {}
:
> mytable = {}
當往表中增加數據時,它就如同創建變數一樣,區別在於這裡的變數之前總是以表名開頭,中間使用 .
來連接:
> mytable.foo = "hello world"
> mytable.bar = 1+2
> print(mytable.foo)
hello world
> print(mytable.bar)
3
使用 Lua 編寫腳本
在終端交互環境中運行 Lua 可以得到良好的反饋,但是將 Lua 作為腳本運行會更為有用。Lua 腳本就是包含 Lua 代碼的文本文件,Lua 命令可以解析並執行此文件。
在剛剛開始學習一門編程語言時,一個永恆的問題是你怎麼知道該寫什麼。這篇文章將提供一個不錯的開端,截至目前,你僅知道了兩三個 Lua 函數。懂得查閱文檔是很關鍵的。Lua 並不是一個複雜的語言,可以通過 Lua 文檔網站 很方便的獲取關鍵字以及函數的用法。
下面是一個練習題。
假設你想編寫一個 Lua 腳本來統計句子中的單詞數量。與眾多的編程挑戰一樣,有許多方法可以解決這個問題,假設你在 Lua 文檔中找到的第一個相關的函數是 string.gmatch
,此函數可以搜索字元串中的特定字元。單詞通常通過空格分隔開來,所以你決定計算空格數並加 1 來作為單詞的數量。
下面是實現的代碼:
function wc(words,delimiter)
count=1
for w in string.gmatch(words,delimiter) do
count = count + 1
end
return count
end
下面是這個樣例代碼的解釋:
function
:這是聲明函數開始的關鍵字。自定義函數的工作方式與內置函數(如print
和string.len
)基本相同。words
和delimiter
:這是函數運行所需的參數。正如print('hello')
當中,hello
是一個參數。counter
:一個變數,且被初始化為1
。for
:在循環中使用string.gmatch
作為迭代器遍歷words
,並且在其中搜索delimiter
。count = count + 1
:當搜索到了delimiter
,則對count
進行自增 1 的操作。end
:for
循環的結束關鍵字。return count
:這個函數輸出(或返回)count
變數的內容。end
:函數結束的關鍵字。
現在你已經創建了一個函數,你可以使用它。需要記住,函數不會自動運行,而是等待你在代碼中調用它。
將下面的代碼寫入文件並保存為 words.lua
:
function wc(words,delimiter)
count=1
for w in string.gmatch(words,delimiter) do
count = count + 1
end
return count
end
result = wc('zombie apocalypse',' ')
print(result)
result = wc('ice cream sandwich',' ')
print(result)
result = wc('can you find the bug? ',' ')
print(result)
你現在創建了一個 Lua 腳本。你可以使用 Lua 運行它。隨後你會發現統計單詞的結果有些問題:
$ lua ./words.lua
2
3
6
你也許已經注意到了最後一個句子的單詞統計不正確,因為在句子的最後帶有一個額外的空格。Lua正確的檢測到了空格,並將其計入 count
中,但是單子的統計是錯誤的,因為有個空格並沒有作為單詞的分隔出現。我把這個問題留給你來解決,或者去發現其他方法,即使方法不太理想。編程中有很多需要思考的地方。有時是純粹學術性的思考,有時也許是應用是否運訓正常的思考。
學習 Lua
Lua 是一個有趣且強大的語言,隨著版本的推進,功能愈發的強大,開發者群體也在不斷的增長。你可以將 Lua 作為實用性的個人腳本使用,或者在工作中使用,或者僅僅是體驗一下一個新的語言。嘗試一下,看看 Lua 能給你帶來什麼吧。
(LCTT 譯註:順便問一句,你知道 「Lua」 怎麼發音嗎? ?)
via: https://opensource.com/article/22/11/lua-worth-learning
作者:Seth Kenlon 選題:lkxed 譯者:MuggleWei 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive