Lua整理

目錄

[TOC]

1 簡介

Lua是C語言開發(fā)的輕量腳本語言雀鹃,以源代碼形式開放檬洞。

設(shè)計的目的是聚霜,嵌入到應(yīng)用程序中,為應(yīng)用程序提供靈活的擴(kuò)展定制功能嘶卧。

官網(wǎng):

http://www.lua.org/

中文參考手冊:

https://www.runoob.com/manual/lua53doc/contents.html

2 安裝

2.1 網(wǎng)頁運(yùn)行地址

官方demo地址尔觉,這在網(wǎng)頁運(yùn)行腳本:

https://www.lua.org/cgi-bin/demo

2.2 linux安裝

  • 安裝依賴
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
  • 下載編譯安裝
#下載
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
#解壓
tar -xzvf lua-5.3.5.tar.gz
#切換目錄
cd lua-5.3.5
#編譯
make linux
#安裝
make linux install
  • 校驗

    • 查看明了文件

      /usr/local/bin目錄下會出現(xiàn)執(zhí)行文件:lua、luac芥吟。

    • 查看當(dāng)前版本

      [root@localhost /]# lua -v
      Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
      
    • 簡單命令測試

      [root@localhost /]# lua
      Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
      > print('hello world')
      hello world
      >
      

2.3 windows安裝

2.3.1 安裝LuaForWindows
  • 下載地址

https://github.com/rjpcomputing/luaforwindows/releases

  • 配置SciTE

    • 代碼提示

      Options->Open User Options File侦铜,增加如下配置:

      # 增加代碼提示功能( 當(dāng)按下句點(diǎn) '.'专甩, 以及字母鍵的時候, 彈出自動完成提示钉稍。)
      autocomplete.*.start.characters=.$(chars.alpha)
      
  • 支持中文

    #支持中文字符++++++++++++++++++++++++++++
    #支持中文 963表示簡體中文
    code.page=936
    output.code.page=936
    #不啟用的話涤躲,在輸出區(qū)中文可能會亂碼
    character.set=134
    
2.3.2 Idea安裝插件

idea選擇插件EmmyLua,進(jìn)行安裝贡未。

新建項目時种樱,項目類型選擇Lua

2 編程方式

代碼不需要以;結(jié)尾俊卤,區(qū)分大小寫嫩挤。

  • 交互式編程

    可通過lua控制臺,輸入程序消恍,查看結(jié)果岂昭。

  • 腳本式編程

    編寫lua腳本*.lua,執(zhí)行腳本查看結(jié)果狠怨。

3 注釋

3.1單行注釋

-- 單行注釋

3.2 多行注釋

--[[
    多行注釋1
    多行注釋2
]]

3 數(shù)據(jù)類型

8種數(shù)據(jù)類型约啊,通過關(guān)鍵字type可查看數(shù)據(jù)類型。

function fun1()
   -- function body 
end
print(type(123),type('tom'),type({}),type(fun1));

執(zhí)行結(jié)果:

number string table function

3.1 nil

nil表示空佣赖,沒有值恰矩。if判斷中nil和false都屬于false0為true憎蛤。

使用未定義的變量時外傅,結(jié)果為nil,刪除變量時蹂午,也通過賦值為nil實(shí)現(xiàn)栏豺。

3.2 boolean

布爾類型彬碱,有兩個值豆胸,true和false。

3.3 string

字符串類型巷疼,可用單引號或雙引號表示字符串晚胡。

字符串拼接使用..,如下:

print('123'..'456')

執(zhí)行結(jié)果為:

123456

3.4 number

雙精度浮點(diǎn)數(shù)嚼沿,8個字節(jié)估盘。

3.4.1 隱式轉(zhuǎn)換

通過運(yùn)算,string轉(zhuǎn)換number

字符類型的變量執(zhí)行數(shù)字運(yùn)算骡尽,如字符串中的內(nèi)容均為數(shù)字遣妥,則執(zhí)行結(jié)果的類型為number,如下:

a,b='123','456'
c=a+b
print(c)
print(type(a),type(b),type(c))

執(zhí)行結(jié)果:

579
string string number

如字符串執(zhí)行數(shù)字運(yùn)算攀细,字符串中的內(nèi)容不為數(shù)字箫踩,則執(zhí)行報錯

a,b='123','abc'
c=a+b
print(c)
print(type(a),type(b),type(c))

執(zhí)行結(jié)果:

lua.exe: test1.lua:2: attempt to perform arithmetic on global 'b' (a string value)
stack traceback:
test1.lua:2: in main chunk

3.5 table

table(表)爱态,是lua中靈活的數(shù)據(jù)結(jié)構(gòu),可以用來創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)境钟,類似于java中的map锦担。table有類似map的key和map。

3.5.1 初始化

同一個table中慨削,key既可以為數(shù)字洞渔,也可以為字符串,value可以為任意類型缚态。

  • 構(gòu)建list

    tab={'tom','jack'}
    for k,v in pairs(tab) do
        print(type(k),type(v),k,v)
    end
    

    結(jié)果如下:

    number string 1 tom
    number string 2 jack

  • 構(gòu)建map

    tab={name='tom',age=18}
    for k,v in pairs(tab) do
        print(type(k),type(v),k,v)
    end
    

    結(jié)果如下:

    string string name tom
    string number age 18

  • 混合構(gòu)建

    tab={'tom',name='zhangsan','jack',age=14}
    for k,v in pairs(tab) do
        print(type(k),type(v),k,v)
    end
    

    number string 1 tom
    number string 2 jack
    string string name zhangsan
    string number age 14

3.5.2 設(shè)置獲取值

table中代表列表key索引值從1開始磁椒,而不是從0開始

key只能為數(shù)字或字符串玫芦。如table為tab1衷快,
當(dāng)key為數(shù)字時,獲取key對應(yīng)的內(nèi)容為:tab[1]姨俩,設(shè)置key的值為:tab[1]=xxx蘸拔;
當(dāng)key為數(shù)字或字符串時,獲取key對應(yīng)的內(nèi)容為tab['myKey']环葵、tab.myKey调窍,設(shè)置key的值為:tab['myKey']=xxxtab.myKey=xxx

3.6 function

3.6.1 格式

格式

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

參數(shù)說明

optional_function_scope: 該參數(shù)是可選的制定函數(shù)是全局函數(shù)還是局部函數(shù)张遭,未設(shè)置該參數(shù)默認(rèn)為全局函數(shù)邓萨,如果你需要設(shè)置函數(shù)為局部函數(shù)需要使用關(guān)鍵字 local。
function_name: 指定函數(shù)名稱菊卷。
argument1, argument2, argument3..., argumentn: 函數(shù)參數(shù)缔恳,多個參數(shù)以逗號隔開,函數(shù)也可以不帶參數(shù)洁闰。
function_body: 函數(shù)體歉甚,函數(shù)中需要執(zhí)行的代碼語句塊。
result_params_comma_separated: 函數(shù)返回值扑眉,Lua語言函數(shù)可以返回多個值纸泄,每個值以逗號隔開。

舉例:

function funTest()
    -- function body
end
3.6.2 參數(shù)

參數(shù)可以為定長參數(shù)腰素,也可以為變長參數(shù)聘裁。

  • 定長參數(shù)

    function funTest(name,age)
        print(name,age)
    end
    funTest('tom',14)
    

    輸出結(jié)果:

    tom 14

  • 變長參數(shù)

    變長參數(shù),函數(shù)定義時用...來表示弓千。

    函數(shù)內(nèi)部衡便,通過{...}獲取變長參數(shù),獲取的結(jié)果類型為table

    函數(shù)內(nèi)部镣陕,可以通過select關(guān)鍵字獲取可變參數(shù)的相關(guān)信息征唬。select('#'...)表示獲取可變參數(shù)的長度;select(n,...)表示獲取第n個到第select('#',...)個的參數(shù)結(jié)果茁彭,獲取的內(nèi)容為一組返回值总寒,獲取的類似function返回的多個值,而不是table理肺。

  • 舉例:

    --定義函數(shù)
    function funTest(...)
        print('[參數(shù)類型]:'..type({...}))
        print('[參數(shù)個數(shù)]:'..select('#',...))
        for v,k in pairs({...}) do
            print(v,k)
        end
        print('[select循環(huán)參數(shù)]:')
        for i=1,select('#',...) do
            local val=select(i,...)
            print(i,val) 
        end
    end
    --調(diào)用函數(shù)
    funTest('tom',14,'remark')
    

    輸出結(jié)果:

    [參數(shù)類型]:table
    [參數(shù)個數(shù)]:3
    1 tom
    2 14
    3 remark
    [select循環(huán)參數(shù)]:
    1 tom
    2 14
    3 remark

3.6.3 返回值

函數(shù)可以有多個返回值摄闸,如下:

--定義函數(shù)
function funTest()
    return 'tom',14,'remark'
end
--調(diào)用函數(shù)
a,b,c,d=funTest();
print(a,b,c)

執(zhí)行結(jié)果:

tom 14 remark

3.6.4 First-Class Value

第一函數(shù)值,函數(shù)名和變量名之間沒有區(qū)別妹萨,他們之間可以互相賦值年枕。

function fun1()
    print("fun1")
end
a=123
print(a)
a=fun1
print(a

執(zhí)行結(jié)果:

123
function: 00C6BC40

3.6.5 匿名函數(shù)

函數(shù)支持匿名函數(shù),類似java中的匿名函數(shù)乎完。

function fun1(name,printFun)
    printFun(name)
end
fun1("tom",function(myName)
    print(myName .. ' is call')
end)

執(zhí)行結(jié)果:

tom is call

3.7 thread

線程相關(guān)熏兄,待完善。

3.8 userdata

C語言結(jié)構(gòu)相關(guān)树姨,待完善摩桶。

4 變量

4.1 作用范圍

默認(rèn)情況下,所有變量均為全局變量帽揪,如將變成設(shè)置為局部變量硝清,變量前需加local關(guān)鍵字,如下:

local userName='tom'

4.2 命名規(guī)則

  • 變量命名转晰,可以有字母芦拿、數(shù)字。下劃線
  • 只可以以字母查邢、下劃線開頭定義變量蔗崎。不可以以數(shù)字開頭,不建議以_+大寫字母開頭扰藕,否則容易和lua內(nèi)部變量沖突(lua內(nèi)部變量采用此命名規(guī)則)
  • 不可以用關(guān)鍵字作為變量

4.3 類型

變量類型可以根據(jù)變量的值確定缓苛。同一個變量多次賦值不同類型的數(shù)據(jù)后,變量類型發(fā)生變化实胸。

執(zhí)行代碼:

a='tom'
print(a)
a=123
print(a)

執(zhí)行結(jié)果:

tom
123

4.4 賦值

  • 為多個參數(shù)賦值

    可以一次性給多個參數(shù)賦值。類似

    prarm1,param2,parma3=value1,value2,value3

    會依次將=號右邊的值按照順序依次賦值給左邊的變量庐完。=號``兩側(cè)的數(shù)量可以不一致,當(dāng)變量個數(shù)比值的個數(shù)多時徘熔,后面多余的變量自動賦值為nil(相當(dāng)于沒有定義該變量)门躯,當(dāng)變量的個數(shù)比值的個數(shù)少的時候,多余的賦值酷师,將忽略讶凉。

  • 執(zhí)行順序

    lua中對參數(shù)賦值時染乌,先將=號右面的內(nèi)容計算完畢后,再賦值給左邊懂讯。

    因此荷憋,交換變量內(nèi)容時,可以寫作:

    a,b=123,456
    print(a,b)
    a,b=b,a
    print(a,b)
    

    執(zhí)行結(jié)果:

    123 456
    456 123

4.5 刪除

獲取沒有定義的變量褐望,內(nèi)容為nil勒庄。變量直接賦值為nil,則將變量刪除瘫里。

如果給變量賦值為nil实蔽,和變量未初始化,效果一樣谨读。

執(zhí)行代碼:

-- 調(diào)用未定義的變量
print(a)
-- 變量賦值
a='tom'
print(a)
-- 刪除變量
a=nil
print(a)

執(zhí)行結(jié)果:

nil
tom
nil

4.6 值傳遞/引用傳遞

值傳遞:變量之間賦值局装,將老變量的內(nèi)容拷貝了一份給新的變量。新的變量更改內(nèi)容不影響老的變量劳殖。
引用傳遞: 變量之間的賦值铐尚,將老的變量對內(nèi)容的引用傳遞給信的變量,新老變量對應(yīng)的內(nèi)容內(nèi)存地址一致哆姻,新的變量和老的變量更改內(nèi)容塑径,均會影響對方。

lua變量賦值填具,table為引用傳遞统舀,其他均為值傳遞

  • 值傳遞

    a=123
    b=a
    b=456
    print(a,b)
    

    執(zhí)行結(jié)果:

    123 456

  • 引用傳遞

    function printTable(tab)
        for k,v in pairs(tab) do
            print(k,v);
        end
    end
    a={name="tom",age="18"}
    b=a
    printTable(a)
    printTable(b)
    b.name='jerry'
    print('===============after change===============')
    printTable(a)
    printTable(b)
    

    執(zhí)行結(jié)果:

    name tom
    age 18
    name tom
    age 18
    ===============after change===============
    name jerry
    age 18
    name jerry
    age 18

5 流程

5.1 循環(huán)

5.1.1 for循環(huán)
  • 數(shù)值for循環(huán)

    數(shù)值for循環(huán)劳景,根據(jù)條件判斷指定的循環(huán)次數(shù)誉简,每次循環(huán)執(zhí)行對應(yīng)循環(huán)體。

    主要用來指定循環(huán)次數(shù)盟广,exp1闷串,exp2如果為公式,只執(zhí)行一次筋量。

    • 格式
    for var=exp1,exp2,exp3 do  
        -- <執(zhí)行體>  
    end  
    

    var 從exp1變化到exp2烹吵,中間每次變化的步長為exp3。exp3可以省略桨武,默認(rèn)為1肋拔。

    • 具體
  • 泛型for循環(huán)

    泛型for循環(huán),主要用來遍歷table呀酸。

    格式:

    for k,v in pairs(table1) do
      -- <執(zhí)行體>
    end
    

    其中凉蜂,k為table的鍵,v為table的值。

    循環(huán)會過濾掉值為nil的key(table中key對應(yīng)的值為nil窿吩,表示key不存在)茎杂,如下:

    function printTable(tab)
        for k,v in pairs(tab) do
            print(k,v);
        end
    end
    tab1={name="tom",remark=nil,age=18,other=nil}
    printTable(tab1)
    

    執(zhí)行結(jié)果如下,會忽略掉值為nil的鍵纫雁,remark和other:

    age 18
    name tom

5.1.2 while循環(huán)
  • 格式

    while(condition)
    do
       -- <執(zhí)行體>
    end
    

    根據(jù)條件condition判斷是否執(zhí)行煌往。

5.2 if判斷

? if條件判斷,可以進(jìn)行嵌套轧邪。

  • if語句

    if(布爾表達(dá)式)
    then
       --[ 在布爾表達(dá)式為 true 時執(zhí)行的語句 --]
    end
    
  • if...else語句

    if(布爾表達(dá)式)
    then
       --[ 布爾表達(dá)式為 true 時執(zhí)行該語句塊 --]
    else
       --[ 布爾表達(dá)式為 false 時執(zhí)行該語句塊 --]
    end
    
  • if...elseif...else 語句

    if( 布爾表達(dá)式 1)
    then
       --[ 在布爾表達(dá)式 1 為 true 時執(zhí)行該語句塊 --]
    
    elseif( 布爾表達(dá)式 2)
    then
       --[ 在布爾表達(dá)式 2 為 true 時執(zhí)行該語句塊 --]
    
    elseif( 布爾表達(dá)式 3)
    then
       --[ 在布爾表達(dá)式 3 為 true 時執(zhí)行該語句塊 --]
    else 
       --[ 如果以上布爾表達(dá)式都不為 true 則執(zhí)行該語句塊 --]
    end
    

6 模塊

6.1 用途

6.2 舉例

定義文件myModule.lua

-- 定義私有表
local myModule={name='tom'}
local function getResult(param)
    -- 私有方法
    return myModule.name .. ' say:' .. param
end
function myModule:say(param)
    -- 公有方法
    print(getResult(param))
end
-- 返回表
return myModule

調(diào)用:

myModule=require('myModule')
myModule:say('hello')

執(zhí)行結(jié)果:

tom say:hello

6.3 加載機(jī)制

...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刽脖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闲勺,更是在濱河造成了極大的恐慌曾棕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菜循,死亡現(xiàn)場離奇詭異翘地,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)癌幕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門衙耕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勺远,你說我怎么就攤上這事橙喘。” “怎么了胶逢?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵厅瞎,是天一觀的道長。 經(jīng)常有香客問我初坠,道長和簸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任碟刺,我火速辦了婚禮锁保,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘半沽。我一直安慰自己爽柒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布者填。 她就那樣靜靜地躺著浩村,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幔托。 梳的紋絲不亂的頭發(fā)上穴亏,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蜂挪,我揣著相機(jī)與錄音重挑,去河邊找鬼嗓化。 笑死,一個胖子當(dāng)著我的面吹牛谬哀,可吹牛的內(nèi)容都是我干的刺覆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼史煎,長吁一口氣:“原來是場噩夢啊……” “哼谦屑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起篇梭,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氢橙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恬偷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悍手,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年袍患,在試婚紗的時候發(fā)現(xiàn)自己被綠了坦康。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡诡延,死狀恐怖滞欠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肆良,我是刑警寧澤筛璧,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站惹恃,受9級特大地震影響夭谤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜座舍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一沮翔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曲秉,春花似錦采蚀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亥鸠,卻和暖如春妆够,著一層夾襖步出監(jiān)牢的瞬間识啦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工神妹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颓哮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓鸵荠,卻偏偏與公主長得像冕茅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛹找,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354