lua入門教程

print("hello lua")

lua官網
在線運行代碼

數據類型

數據類型 描述
number 數字,可當作double,5/2 == 2.5
integer 整數,可當作int64,有整除符號,5//2 == 2lua 5.3 版本開始支持
string 字符串
nil 空值,變量未賦值前都是nil,給變量賦值nil相當于釋放變量
boolean 布爾值,true和false
table 兩種形態:1. hash表 2. 數組
function 函數,數據類型一種,可以賦值給變量或作為參數
userdata 自定義數據,用于擴展,lua vm負責內存管理
還有種light userdata,可以理解成void *值類型,不需要內存管理

字符串定義

四種字符串定義方式

text1 = "最普通的字符串"
text2 = '和"一樣'
text3 = [[
長字符串定義,忽略任何轉義,最前面的換行,會被忽略
]]
text4 = [===[
長字符串定義,忽略任何轉義,加=號為了能在字符串里寫 a[b[1]],=數量不限
]===]

關鍵字

and break do else elseif end false for function if in
local nil not or repeat return then true until while

關鍵字不能用用作變量名。特別的:a.end = 1出錯,但是可以用a["end"] = 1

注釋

-- 單行注釋
--[[
    多行注釋,-和[之前不能有空格
]]

數字運算

  • + - * / 基本的加減乘除,注意5/2 == 2.5
  • % 取余,a%b = a - b * \lfloor {a/b} \rfloor,可用于浮點數1%-1.5 == -0.5
  • ^ 冪乘,a^i = a^i

字符串運算

  • .. 字符串連接符,print("hello".." ".."world")輸出hello world

邏輯運算

  • == ~= 相等比較,任意類型都可以,注意2 ~= "2"
  • > < >= <= 大小比較,不能數字字符串混用,2 > "3"會報錯
  • not 非運算,not not a相當于a ? true : false
  • and 與運算,a and b相當于a ? b : a,如果a為假值(nil或者false),返回a,否則返回b
  • or或運算,a or b相當于a ? a : b

注意:

  • andor的返回值不是bool類型的,而是參與運算的值的其中一個。
  • nilfalse為假值,其他都是真值。也就是說,空串""、數字0和空表{}都是真值。

變量

全局變量不需要聲明,任何時候a = 10都是有效的,在a被賦值前,取a的值返回nil。

局部變量聲明使用local關鍵字,支持塊作用域,支持一次聲明多個。

local a,b = 1,2
if a then
    local a,b = 10,20
    print(a,b) -- 輸出10   20
end
print(a,b) -- 輸出1    2

補充:
局部變量性能好于全局變量,它的值在棧上,訪問時用的索引。
全局變量是取的全局表。print(1)等同于_G["print"](1)
可以修改下變成

local print = print
print(1)

賦值語句

lua的=表達式比較特殊,支持一次賦值多個,多余的忽略,不夠的補nil。

a, b = 1,2,3 -- 3忽略
c, d = 4 -- d是nil

交換x和y的值可以寫成x,y = y,x,十分方便。

條件語句

三個基本結構。

if x then
    print("if語句,如果x為真,輸出這句話")
end
if x then
    print("if + else語句")
else
    print("如果x為假,輸出這句話")
end
if x then
    print("if + elseif語句")
elseif y then
    print("x為假,y為真,才輸出這句話")
end

for循環

例子:

for i = 1,3 do
    print(i)
end

輸出 1,2,3

可以指定步長

for i = 1,3,2 do
    print(i)
end

輸出 1,3

補充:還有種for in循環在table使用小節里介紹。

while循環

條件成立繼續循環,例子:

local i = 1
while i <= 3 do
    print(i)
    i = i+1
end

repeat循環(不常用)

條件成立退出循環,例子:

local i = 1
repeat
  print(i)
  i = i + 1
until i > 3

break語句

可以用break退出上述三種循環。
注意:

  • break需要是代碼塊的最后一個語句。
  • 沒有continue語句。
while true do
  break --錯誤,后面還有代碼
  local i
end

while true do
  do break end -- 正確.do XXX end 是一個的代碼塊,break 確實放在了這段代碼的最后面
  local i
end

table·數組

table的第一種形態:數組

1. 初始化

t = {1,2} -- 索引從數字1開始,相當于下面的例子
t = {}; 
t[1] = 1;
t[2] = 2;

2. 插入刪除

t = {1,2,3}
table.insert(t,4) -- 在結尾追加4,變成{1,2,3,4}
table.remove(t)   -- 移除結尾元素,變成{1,2,3}
table.remove(t,2) -- 移除第2個元素,變成{1,3},會移動后邊的元素

3. 獲取長度

t = {1,2,3}
print(#t) -- 3

4. 遍歷

t = {1,2,3}
for i = 1,#t do
    print(i .. " : " .. t[i]) -- 1:1 2:2 3:3
end
-- 這就是第二種for循環
for i,v in ipairs(t) do
    print(i .. " : " .. v) -- 和上面一樣的功能
end

6. 排序

t = {1,3,2}
table.sort(t) -- 1,2,3
table.sort(t,function(a,b) return a > b end) -- 3,2,1

注意:

  • table當成數組使用,數字索引從1開始
  • table當成數組用時,要保證是緊湊數組,索引1..n,t[i] ~= nil -- i in [1,n],后面會說明為什么。

table·hash表

table當成hash表使用

1. 初始化


t = {["x"] = 10, ["y"] = 20}
t = {x = 10, y = 20} -- 字符常量索引,和上面一樣
-- 多維數組
t = {
    hp = 10,
    pos = {100,200},
}

2. 刪除


t = {x = 1, y = 2}
t["x"] = nil -- 刪除key "x"

3. 遍歷


t = {x = 1, y = 2}
for k,v in pairs(t) do
    print(k .. ":".. v) -- x:1  y:2
end

注意:

  • table的key(索引)可以是除nil以外的任何值,t[nil] = 1報錯
  • table的value(值)可以是任何值,特別的:t['x'] = nil的效果是刪除t['x']的值
  • t["x"]可以簡寫成t.x,x不能是關鍵字,t.end = 1報錯

table·不要數組和hash混用

table實際也可以混合數組和hash部分,如下

t = {
    1,
    ["x"] = 2,
    y = 3,
    [4] = 4,
}

最好不要這么使用,數組和hash表是兩個不同的語義結構,lua的table實現混合了他們,可以統一理解成hash表。
table使用有坑
其中最大的坑獲取數組長度,lua提供了#運算符。
但是:如果table的key不是1..n,結果可能出錯,因為這個返回的是一個n,滿足t[n] ~= nil and t[n+1] == nil。

t = {1,2}
t[3] = 1 
print(#t) -- 數組是{1,2,3} 結果是 3
t[2] = nil 
print(#t) -- 數組是{1,nil,3} 結果是1

如果是hash表,hash值作為索引,結果會更難預料。
所以說:table作為數組用,最好的緊湊數組

函數

兩種函數聲明形式

function func(a,b)
    -- 先定義func變量,再定義函數,可以在這兒使用func遞歸調用
end
func = function(a,b)
    -- 先定義了匿名函數,再賦值給變量func,這兒不能使用func遞歸調用
end

都是聲明一個名字叫func,參數是a,b的函數。
參數不需要說明類型,返回值不需要說明。

函數可以返回任何個數的數據,使用return返回,returnbreak一樣,必須在代碼塊的最后面。
函數參數可以接受任意多個,使用...來接受

function generate()
    return 1,2,3
end
function MyPrint(...)
    print("my print:",...)
end

MyPrint(generate()) -- my print:    1    2    3
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容