lua學習<基礎概念>

基礎概念

程序塊 (chunk)

定義


lua 中的每一個源代碼文件或在交互模式(Cmd)中輸入的一行代碼都稱之為程序塊一個程序塊就是一連串語句或者命令lua 中連續的語句不需要分隔符,但為了可讀性可以加換行,或者分隔符分號 ; 來分割語句但是換行在代碼中沒有任何作用,僅僅是為了提高可讀性


<code>a = 1b = a * 2​a = 1;b = a * 2​a = 1; b = a * 2a = 1 b = a * 2/<code>


一個程序塊可以僅包含一條語句,也可以由多條不同的語句或函數的定義構成


程序塊可以是任意大小的可以將程序塊保存在文件中然後再執行也可以將程序塊放到交互模式中運行解釋器


當使用任何參數直接運行解釋器時會看到這樣得提示符


<code>Lua 5.1.5 Copyright (C) 1994-2012 Lua.org Puc-Rio>/<code>再這種模式下輸入得每條命令都將立即被執行要退出交互模式和解釋器可以調用操作系統庫的 exit 函數,輸入 os.exit()或者 end-of-file 控制字符,在 DOS/Windows 中是

Ctrl + Z在交互模式中解釋器通常將所輸入的內容當作一個完整的程序塊來解釋如果解釋器檢測到某行所輸入的內容不足以構成一個完整的程序塊,那麼它就會等待輸入這種機制的存在使得我們可以在交互模式中輸入某些函數的多行定義


但將多行內容放入文件中才是更常見的做法


然後在交互模式中通過調用解釋器來執行文件

<code>-- fact.lua 階乘文件function fact(n) if n == 0 then return 1 --0的階乘是1 else return n * fact(n - 1) --輸入3會執行 3 * 2 * 1 endendprint("Enter a number:")a = io.read("*number")print(fact(a))/<code>


-i 參數

通過 -i 參數來啟動解釋器lua -i prog這樣會先運行文件 prog 中的程序塊後再進入交互模式


讀取用戶輸入並指定格式

io.read("*number") 讀取數字格式


dofile 函數

立即執行一個函數文件運行後如果無報錯相當於加載了這個lua 文件中的函數庫就可以在後續的交互模式中直接調用這個函數庫裡定義的方法方便測試新的代碼,在代碼編輯器中修改後在交互模式中執行dofile即加載修改後新的代碼使用 dofile 后里面字符串文件路徑的 \\ 記得再用一次 \\ 進行轉義如:dofile("d:\\demo\\a.lua")

<code>-- lib1.lua-- 計算兩個數的平方和在開平方根function norm(x, y) return (x ^ 2 + y ^ 2) ^ 0.5end-- 計算某數的兩倍function twice(n) return n * 2end/<code>


<code>> dofile("lib1.lua") -- 加載你編寫的程序庫,需要填完整的文件路徑> n = norm(3.14, 1.0)> print(twice(4)) -- 8/<code>


詞法規範

標識符

可以由任意字母、下劃線、數字構成的字符串但不可以由數字開頭


避免使用以一個下劃線開頭之後跟著一個或多個大寫字母的標識符

lua 會將這些標識符保留,用作特殊用途如 _VERSION, _PROMPT因為這是 lua 中的啞變量


區域設置(Locale)


在 lua 中什麼是字母的概念依賴於區域設置(Locale)如果設置了對應的區域如希臘,就可以使用希臘字母作為變量名了但這樣的變量可能無法在不支持該區域的系統上運行


保留字


andbreakdoelseelseifendfalseforfunctionidinlocalnilnotorrepeatreturnthentrueuntilwhile


lua中區分大小寫,如 "And" "AND" 是可以作為變量的,且與保留字 and 完全不同


註釋的寫法

單行註釋:--code block多行註釋:--[[ code block ]]一旦寫了註釋後面的代碼將不會起作用,解釋器會將其忽略小技巧:建議這樣寫多行註釋 --[[ code block --]]可以在塊註釋前加一個連字符 - 即可啟用代碼塊中的代碼


<code>--[[ print(222) print(666) --都不起作用(因為塊註釋註釋掉了其中的代碼)--]]​-- 常規寫法加一個連字符寫塊註釋---[[ print(222) print(666) --會報錯]]​-- 推薦寫法加一個連字符寫塊註釋-- 因為這樣寫的話,第一行和最後一行就變成了兩個彼此獨立的單行註釋---[[ print(222) print(666)--]]/<code>


全局變量

全局變量不需要聲明只需要將一個值賦給這個全局變量即可創建在 lua 中訪問一個未初始化的變量並不會發生錯誤但訪問的結果是一個特殊的值 nil ,也就是空值刪除全局變量,將它賦值為 nil

<code>print(b) -- nilb = 10print(b) -- 10​-- 刪除全局變量b = nil print(b) -- nil/<code>


解釋器程序

[] 代表可選項lua [選項參數] [腳本[參數]]不使用參數會直接進入交互模式-e 直接在命令行中輸入代碼如果只有 -e ,沒有 -i 那麼就不會進入交互模式,而是運行後直接結束-l 用於加載庫文件


_PROMPT


修改這個全局變量,就會修改交互模式下的命令提示符外面的雙引號用於阻止 shell 誤解內層的單引號

<code>lua -i -e "_PROMPT = 'lua>'"Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Riolua>/<code>


在交互模式中打印任何表達式的值


print()也可以使用等號開頭後面跟一個表達式 =


在解釋器執行其參數前


先會尋找一個 LUA_INIT 的環境變量如果找到了,並且它的內容為 @文件名 的話解釋器就會先執行這個文件如果 LUA_INIT 沒有以 @ 開頭,解釋器就假設變量內容為 lua 代碼,並運行這段 lua 代碼LUA_INIT 可以靈活地配置解釋器,並且可以完全控制如何配置它比如:可以預先加載一個程序包(Package)、修改命令提示符和路徑、定義函數、對函數進行改名或刪除等。


運行腳本前的參數

在腳本代碼中,可以通過全局變量 arg 來檢索腳本的啟動參數解釋器在運行腳本前,會用所有的命令行參數創建一個名為 arg 的 table腳本名稱位於索引 0 上它的第一個參數(示例中的 a) 位於索引1 ,以此類推而在 腳本文件(示例中的>


<code>lua 腳本 a b clua -e "sin = math.sin">

<code>lua 腳本 a b clua -e "sin = math.sin">


通常腳本只會使用正數索引(示例中的 arg[1] 和 arg[2])在 lua 5.1 中,一個腳本還可以通過 “變長參數語法” 來檢索其參數在腳本主體中,表達式 "..." 3個點表示所有傳遞給腳本的參數


心得體會


local 局部變量使用return 用於返回if, elseif, then, end, 用於條件判斷程序結構for, while, then, end 用於循環程序結果and, not, or 用於邏輯判斷function 用於定義函數true false 用於條件值的判斷nil 用於將全局變量、table中的元素銷燬,也是變量在未賦值之前的默認值


沒有熟練掌握的保留字


breaktruefalseinlocalnilnotreturnwhile