基礎概念
程序塊 (chunk)
定義shell
- lua 中的每個源代碼文件或在交互模式(Cmd)中輸入的一行代碼都稱之爲程序塊
- 一個程序塊就是一連串語句或者命令
- lua 中連續的語句不須要分隔符,但爲了可讀性能夠加換行,或者分隔符分號 ; 來分割語句
- 可是換行在代碼中沒有任何做用,僅僅是爲了提升可讀性
a = 1
b = a * 2
a = 1;
b = a * 2
a = 1; b = a * 2
a = 1 b = a * 2
一個程序塊能夠僅包含一條語句,也能夠由多條不一樣的語句或函數的定義構成數組
- 程序塊能夠是任意大小的
- 能夠將程序塊保存在文件中而後再執行
- 也能夠將程序塊放到交互模式中運行解釋器
當不使用任何參數直接運行解釋器時會看到這樣得提示符編輯器
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org Puc-Rio
>
- 在這種模式下輸入得每條命令都將當即被執行
- 要退出交互模式和解釋器
- 能夠調用操做系統庫的 exit 函數,輸入 os.exit()
- 或者 end-of-file 控制字符,在 DOS/Windows 中是 Ctrl + Z
- 在交互模式中解釋器一般將所輸入的內容看成一個完整的程序塊來解釋
- 若是解釋器檢測到某行所輸入的內容不足以構成一個完整的程序塊,那麼它就會等待輸入
- 這種機制的存在使得咱們能夠在交互模式中輸入某些函數的多行定義
但將多行內容放入文件中才是更常見的作法函數
- 在交互模式中經過調用解釋器來執行文件
-- fact.lua 階乘文件
function fact(n)
if n == 0 then
return 1 --0的階乘是1
else
return n * fact(n - 1) --輸入3會執行 3 * 2 * 1
end
end
print("Enter a number:")
a = io.read("*number")
print(fact(a))
-i 參數測試
- 經過 -i 參數來啓動解釋器
- lua -i prog
- 這樣會先運行文件 prog 中的程序塊後再進入交互模式
讀取用戶輸入並指定格式lua
- io.read("*number") 讀取數字格式
dofile 函數操作系統
- 當即執行一個函數文件
- 運行後若是無報錯
- 至關於加載了這個lua 文件中的函數庫
- 就能夠在後續的交互模式中直接調用這個函數庫裏定義的方法
- 方便測試新的代碼,在代碼編輯器中修改後在交互模式中執行dofile即加載修改後新的代碼
- 使用 dofile 后里面字符串文件路徑的 記得再用一次 進行轉義
- 如:dofile("d:\\demo\\a.lua")
-- lib1.lua
-- 計算兩個數的平方和在開平方根
function norm(x, y)
return (x ^ 2 + y ^ 2) ^ 0.5
end
-- 計算某數的兩倍
function twice(n)
return n * 2
end
> dofile("lib1.lua") -- 加載你編寫的程序庫,須要填完整的文件路徑
> n = norm(3.14, 1.0) -- 3.2953907203851
> print(twice(4)) -- 8
詞法規範
標識符命令行
- 能夠由任意字母、下劃線、數字構成的字符串
- 但不能夠由數字開頭
避免使用以一個下劃線開頭以後跟着一個或多個大寫字母的標識符code
- lua 會將這些標識符保留,用做特殊用途
- 如 _VERSION, _PROMPT
- 由於這是 lua 中的啞變量
區域設置(Locale)orm
- 在 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 --]]
- 能夠在塊註釋前加一個連字符 - 便可啓用代碼塊中的代碼
--[[
print(222)
print(666) --都不起做用(由於塊註釋註釋掉了其中的代碼)
--]]
-- 常規寫法加一個連字符寫塊註釋
---[[
print(222)
print(666) --會報錯
]]
-- 推薦寫法加一個連字符寫塊註釋
-- 由於這樣寫的話,第一行和最後一行就變成了兩個彼此獨立的單行註釋
---[[
print(222)
print(666)
--]]
-- 在註釋塊中包含註釋,在不加 = 的時候會報錯
-- 能夠在註釋 --[任意個=[]]與以前匹配的任意等號]
--[==[
--[[
print("在多行註釋中輸入多行註釋")
--]]
-- print("在多行註釋中輸入單行註釋")
--]==]
全局變量
- 全局變量不須要聲明
- 只須要將一個值賦給這個全局變量便可建立
- 在 lua 中訪問一個未初始化的變量並不會發生錯誤
- 但訪問的結果是一個特殊的值 nil ,也就是空值
- 刪除全局變量,將它賦值爲 nil
print(b) -- nil
b = 10
print(b) -- 10
-- 刪除全局變量
b = nil
print(b) -- nil
解釋器程序
- [] 表明可選項
- lua [選項參數] [腳本[參數]]
- 不使用參數會直接進入交互模式
- -e 直接在命令行中輸入代碼
- 若是隻有 -e ,沒有 -i 那麼就不會進入交互模式,而是運行後直接結束
- -l 用於加載庫文件
_PROMPT
- 修改這個全局變量,就會修改交互模式下的命令提示符
- 外面的雙引號用於阻止 shell 誤解內層的單引號
lua -i -e "_PROMPT = 'lua>'"
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
lua>
在交互模式中打印任何表達式的值
- print()
- 也可使用等號開頭後面跟一個表達式 =
在解釋器執行其參數前
- 先會尋找一個 LUA_INIT 的環境變量
- 若是找到了,而且它的內容爲 @文件名 的話
- 解釋器就會先執行這個文件
- 若是 LUA_INIT 沒有以 @ 開頭,解釋器就假設變量內容爲 lua 代碼,並運行這段 lua 代碼
- LUA_INIT 能夠靈活地配置解釋器,而且能夠徹底控制如何配置它
- 好比:能夠預先加載一個程序包(Package)、修改命令提示符和路徑、定義函數、對函數進行更名或刪除等。
運行腳本前的參數
- 在腳本代碼中,能夠經過全局變量 arg 來檢索腳本的啓動參數
- 解釋器在運行腳本前,會用全部的命令行參數建立一個名爲 arg 的 table
- 腳本名稱位於索引 0 上
- 它的第一個參數(示例中的 a) 位於索引1 ,以此類推
- 而在 腳本文件(示例中的 script ) 以前的的全部選項參數位於負數索引上
lua 腳本 a b c
lua -e "sin = math.sin" script a b
-- 解釋器將全部參數組織排列爲:
arg[-3] = "lua"
arg[-2] = "-e"
arg[-1] = "sin = math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "b"
- 一般腳本只會使用正數索引(示例中的 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
第二日複習
流程控制保留字
- if
- then
- end
- elseif
- for
- do
- while
- until
- repeat
- break
條件判斷保留字
- true
- false
邏輯判斷保留字
- and
- or
- not
其餘保留字
- in
- return 返回
- function 函數
沒記住的保留字
- id
- nil 表示爲空,用於清除變量、table元素
- local 局部變量
在 解釋器執行參數前
概念錯誤,且沒有記住後續步驟
- LUA_INIT的變量
- 找到了 @文件名
- 沒找到
在 lua 運行腳本前的參數
沒有記住全部的內容和概念
程序塊、交互模式、解釋器
記憶的概念沒有匹配對應名稱,記憶混亂的狀況
第三日複習
流程控制保留字
if, elseif, then ,end, break, for, do, return, while, until, repeat
類型保留字
nil, function, local
其餘
in, id
邏輯判斷
and, or, not
條件判斷
true, false
在解釋器執行參數前
- 會先尋找一個名爲 LUA_INIT 的環境變量
- 找到了而且內容爲 @文件名,就會執行這個文件
- 沒找到,就執行解釋器中輸入的內容 【錯誤】
沒找到,就假設這個變量爲 lua 代碼,並執行
第三步記憶和理解出錯
運行腳本前的參數
- 會創建一個名爲 arg 的 table 把這些參數所有存進去
- 腳本名 爲索引 0, 其後的參數以此類推
- 腳本名前的參數爲負數
- 通常不會使用負數索引
- 可變長度參數 ... 【記憶混亂】
須要記憶的點
- 【全局變量 arg】 檢索啓動參數
... 表示全部傳遞給腳本的參數
腳本可經過變長參數語法來檢索參數
全局變量的建立概念和聲明