lua 是動態類型的語言
print(type("Hello")) --string print(type(666)) --number a = print print(type(a)) --function a = 111 print(type(a)) --number print(type(b)) --nil print(type(string)) -- table 不太懂爲何 print(type(type(X))) -- string
nil (空)
boolean (布爾)
布爾類型有兩個可選值,html
number (數字)
科學計數法
a = 3.2e2 print(a) --320
string (字符串)
修改子串
a = "one string" b = string.gsub(a, "one", "another") -- 字符串替換函數 print(b) -- another string print(a) -- one string
字面字符串
a = 'Hello' b = "World" c = "I'm a student" d = "I\'m a student'"
轉義序列
print("one line\nnext line\"in quotes\",'in quotes'") --[[ one line next line "in quotes",'in quotes' --]]
能夠經過數值指定字符串中的字符
print('a' == '\97') -- true
用一對方括號 [[]] 能夠包裹多行字符串數組
page = [[ <html> <head> <title>Lua Study</title> </head> <body> <a href="http://www.lua.org">Lua 學習 </a> </body> </html> ]]
lua 提供了運行時數字和字符串的自動轉換
print("10" + 1) --字符串10會被自動轉換爲數字10,結果打印爲11 print("Hello" + 1) -- 會報錯
字符串鏈接符 ..
print("A".."=".."B") -- A=B print(10..24) -- 會報錯 print(10 .. 24) -- 1024
長度操做符 #
print(#"Hello") -- 5
tonumber
line = io.read() -- 讀取一行 n = tonumber(line) if n = nil then error(line .. " is not a valid number") else print(n * 2) end
tostring
a = 2333 print(tostring(2333) == "2333") -- true print(a .. "" == "2333") -- true
lua 中的 table 類型實現了關聯數組安全
舉例: io.read
在 lua 中不須要聲明一個 table
a = {} -- 建立了一個 Table 把它的引用存儲到 a 這個變量裏,那麼 a 就是一個 table 類型的變量了 k = "x" a[k] = 10 -- 新條目, key = x, value = 10 在 a 這個 table 添加了一個元素,這個 table 的索引是字符串索引,這個新生成的條目的值就是 10,它的索引是 x a[20] = "great" -- 新條目, key = 20, value = "great" print(a["x"]) -- 10 k = 20 print(a[k]) -- great a["x"] = a["x"] + 1 print(a["x"]) -- 11
table 永遠是匿名的
a = {} a["x"] = 10 b = a -- b 與 a 引用了一樣一個 table print(b["x"]) -- 10 a = nil print(a["x"]) --報錯 print(b["x"]) --10 由於如今只有 b 在引用 table ,而 a 已經清除了對 table 的引用 b = nil -- 如今 a 和 b 都沒有對 table 引用了
全部 table 均可以經過不一樣類型的索引來訪問它的值
-- for 循環 ,索引從1開始,與C或其餘語言從0開始不一樣, do 裏面的代碼塊是循環體 t = {} for i = 1, 1000 do t[i] = 2 * i -- 值是索引的兩倍 end print(t[8]) -- 16 t["x"] = 10 print(t["x"]) --10 print(t["y"]) -- nil t["x"] = nil -- 刪除了 table 中索引爲 x 的元素
lua table 訪問的兩種寫法(語法糖)
a.name 的寫法可能暗示了代碼讀者將 table 當作了一條記錄使用數據結構
a["name"]的寫法可能暗示了代碼讀者該 table 能夠以任何字符串做爲 key函數
a.x -- 表示爲 a["x"] 以字符串 x 爲索引 table a[x] -- 以變量 x 的 值 爲索引 table a = {} x = "y" -- x 已經被賦值爲"y" 因此變量 x 的值爲字符串 y ,索引 x 變量就是索引字符串 y a[x] = 10 print(a.x) -- 索引爲字符串 x --> nil print(a["x"]) -- 索引爲字符串 x --> nil print(a[x]) -- 索引爲變量 x --> 10 print("\n") print(a.y) -- 索引爲字符串 y --> 10 print(a["y"]) -- 索引爲字符串 y --> 10 print(a[y]) -- 索引爲變量 y --> nil
表示傳統的數組或線性表
長度操做符 # 對於 table 的做用
t = {} for i = 1, i = 666 do t[i] = i * 2 end print(#t) -- 666, 至關於這個 table 有 666 個元素(或者稱這個 table 的大小爲 666) for i = 1, #t do print(t[i]) end print(t[#t]) -- 打印 table 最後一個值 t[#t] = nil -- 刪除 table 的最後一個值 print(#t) -- 如今 table 的長度就是 665 個 t[#t + 1] = 8888 -- 給 table 再加一個元素 print(#t) -- 如今 table 的長度是 666 個 print(t[#t]) -- 如今 table 的最後一個元素就是 8888 了
數組的實際大小
a = {} a[10000] = 1 print(#a) -- 0 print(a[10000]) -- 1 print(table.maxn(a)) --> 10000
對於索引類型不明確時進行顯式轉換
i = 10 j = "10" k = "+10" t = {} t[i] = "one value" t[j] = "another value" t[k] = "yet another value" print(t[i]) -- one value print(t[j]) -- another value print(tonumber(t[k])) -- one value print(tonumber[t[j]]) -- one value print(t[tonumber(k)]) print(t[tonumber(j)])
lua 全部的標準庫都是用 C 語言編寫的學習