Linux中國

Lua 值得學習嗎?

Lua 是一個有趣而強大的語言,隨著各個版本的推進,功能愈發的強大,開發者群體也在不斷的增長。這篇文章我們將探索一下它的各種前景。

Lua 是一個腳本語言,它面向過程、函數式編程,甚至可以是 面向對象的。它使用類 C 語言的語法,但卻是動態類型,具有自動內存管理和垃圾回收功能,使用基於寄存器的虛擬機來解釋位元組碼。這些特點使得它對於初學者來說是個很好的語言,同時也是經驗豐富的程序員的強大工具。

雖然與 PythonJavaScript 相比,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:這是聲明函數開始的關鍵字。自定義函數的工作方式與內置函數(如 printstring.len)基本相同。
  • wordsdelimiter:這是函數運行所需的參數。正如 print('hello') 當中,hello 是一個參數。
  • counter:一個變數,且被初始化為 1
  • for:在循環中使用 string.gmatch 作為迭代器遍歷 words,並且在其中搜索delimiter
  • count = count + 1:當搜索到了 delimiter,則對 count 進行自增 1 的操作。
  • endfor 循環的結束關鍵字。
  • 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國