基礎概念
程序塊 (chunk)
定義
- lua 中的每一個源代碼文件或在交互模式(Cmd)中輸入的一行代碼都稱之為程序塊
- 一個程序塊就是一連串語句或者命令
- lua 中連續的語句不需要分隔符,但為了可讀性可以加換行,或者分隔符分號 ; 來分割語句
- 但是換行在代碼中沒有任何作用,僅僅是為了提高可讀性
<code>a = 1b = a * 2a = 1;b = a * 2a = 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)
- 如果設置了對應的區域如希臘,就可以使用希臘字母作為變量名了
- 但這樣的變量可能無法在不支持該區域的系統上運行
保留字
- and
- break
- do
- else
- elseif
- end
- false
- for
- function
- id
- in
- local
- nil
- not
- or
- repeat
- return
- then
- true
- until
- while
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中的元素銷燬,也是變量在未賦值之前的默認值
沒有熟練掌握的保留字
- break
- true
- false
- in
- local
- nil
- not
- return
- while
閱讀更多 有所得 的文章