2020-09-16 學(xué)習(xí)筆記1

參考Lua的菜鳥教程跪解,這里寫下來是方便自己查閱衙熔。

Lua的關(guān)鍵字

以下列出了 Lua 的保留關(guān)鍵字匀归。保留關(guān)鍵字不能作為常量或變量或其他用戶自定義標(biāo)示符:

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

一般約定项鬼,以下劃線開頭連接一串大寫字母的名字(比如 _VERSION)被保留用于 Lua 內(nèi)部全局變量蜻直。

Lua的注釋

使用 -- 做單行注釋

使用 --[[ --]]做多行注釋

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

Lua 是動(dòng)態(tài)類型語言饵逐,變量不要類型定義,只需要為變量賦值括眠。 值可以存儲(chǔ)在變量中,作為參數(shù)傳遞或結(jié)果返回倍权。

Lua 中有 8 個(gè)基本類型分別為:nil掷豺、boolean、number薄声、string当船、userdata、function默辨、thread 和 table德频。

數(shù)據(jù)類型 描述
nil 這個(gè)最簡(jiǎn)單,只有值nil屬于該類缩幸,表示一個(gè)無效值(在條件表達(dá)式中相當(dāng)于false)壹置。
boolean 包含兩個(gè)值:false和true。
number 表示雙精度類型的實(shí)浮點(diǎn)數(shù)
string 字符串由一對(duì)雙引號(hào)或單引號(hào)來表示
function 由 C 或 Lua 編寫的函數(shù)
userdata 表示任意存儲(chǔ)在變量中的C數(shù)據(jù)結(jié)構(gòu)
thread 表示執(zhí)行的獨(dú)立線路表谊,用于執(zhí)行協(xié)同程序
table Lua 中的表(table)其實(shí)是一個(gè)"關(guān)聯(lián)數(shù)組"(associative arrays)钞护,數(shù)組的索引可以是數(shù)字、字符串或表類型爆办。在 Lua 里难咕,table 的創(chuàng)建是通過"構(gòu)造表達(dá)式"來完成,最簡(jiǎn)單構(gòu)造表達(dá)式是{},用來創(chuàng)建一個(gè)空表步藕。

我們可以使用 type 函數(shù)測(cè)試給定變量或者值的類型:

print(type("Hello"))

注意字符串可以使用單引號(hào)惦界、雙引號(hào)挑格、或者[[ ]]咙冗。最后一個(gè)類似于Python的三引號(hào)字符串。

--table類型用花括號(hào)包裹漂彤,如下
t = {1, '5', ["sss"] = 52, 's'}
--其中可以直接是值或者變量雾消,也可以是鍵值對(duì)的形式,注意索引的時(shí)候下標(biāo)是從1開始的
--且鍵值對(duì)不能使用下標(biāo)訪問
t[1] --是1
t[3] --是's'
t["sss"] --是52

--下面的例子是如果為一個(gè)不存在的索引賦值挫望,將會(huì)創(chuàng)建該索引
a = {}
a[5] = 5
a["zzz"] = "zun"
print(a[5])  --輸出5
print(a["zzz"])  --輸出"zun"
print(a.zzz)  --輸出"zun" table中的鍵值可以使用'.'來訪問
--如果給table中的位置立润,或者鍵賦值為nil則表示從table中刪除他們,同樣全局變量也可以如此刪除

lua的字符串使用 '..'連接不是使用加號(hào)媳板。

Lua 中的變量全是全局變量桑腮,那怕是語句塊或是函數(shù)里,除非用 local 顯式聲明為局部變量蛉幸。

局部變量的作用域?yàn)閺穆暶魑恢瞄_始到所在語句塊結(jié)束破讨。

for i = 0, 5, 2
do
    local a = 50
end
print(a) --打印為nil 因?yàn)閍是local的,如果去掉local修飾這里就會(huì)打印50奕纫,所以lua要注意只要沒喲local修飾就都是全局變量提陶,不是是聲明在循環(huán)體內(nèi)部還是函數(shù)內(nèi)部
function abs() 
    c = 2
end
abs()
print(c) --打印為2,當(dāng)然如果函數(shù)不調(diào)用一下的話c還是未定義的

應(yīng)該盡可能的使用局部變量匹层,有兩個(gè)好處:

    1. 避免命名沖突隙笆。
    1. 訪問局部變量的速度比全局變量更快。

循環(huán)

Lua中的循環(huán)

a=10
while( a < 20 ) --實(shí)測(cè)這個(gè)小括號(hào)不是必須的去掉也可以
do  --do 不能忘
   print("a 的值為:", a) --縮進(jìn)只是為了好看不想Python是用來區(qū)分語句塊的
   a = a+1 --親測(cè)a++升筏、a += 1 都沒用會(huì)報(bào)錯(cuò)看來都不支持
end

Lua 編程語言中數(shù)值 for 循環(huán)語法格式:

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

var 從 exp1 變化到 exp2撑柔,每次變化以 exp3 為步長(zhǎng)遞增 var,并執(zhí)行一次 "執(zhí)行體"您访,也就是說如果exp3是一個(gè)函數(shù)的返回值的話這個(gè)函數(shù)只會(huì)被執(zhí)行一次铅忿。exp3 是可選的,如果不指定洋只,默認(rèn)為1辆沦,當(dāng)然可以設(shè)置為負(fù)數(shù),這樣每次都是遞減识虚。

for i=10,1,-1 do --加上小括號(hào)是不行的會(huì)報(bào)錯(cuò)肢扯,同樣do也不能去掉,注意變?yōu)? 的時(shí)候仍然執(zhí)行
    print(i)
end
print(i) --打印nil 表明在for里面聲明的i變量是local的

Lua 編程語言中 repeat...until 循環(huán)語法格式:

repeat
   statements
until( condition )

我們注意到循環(huán)條件判斷語句(condition)在循環(huán)體末尾部分担锤,所以在條件進(jìn)行判斷前循環(huán)體都會(huì)執(zhí)行一次蔚晨。

這就是do..while了。

a = 10
repeat
   print("a的值為:", a)
   a = a + 1
until a > 15 --同樣不加小括號(hào)也可以,最好還是加上看起來不費(fèi)勁

控制

a = 2
if (a == 1) --要不要括號(hào)都行最好帶上便于閱讀铭腕,但是then不能缺
then
    print(a)
elseif a == 2
then  --這個(gè)then也不能缺
    print("a is 2")
else  --這里就不需要then了
    print("This is else.")
end

函數(shù)

定義格式如下:

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

解析:

  • 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ù),多個(gè)參數(shù)以逗號(hào)隔開被盈,函數(shù)也可以不帶參數(shù)析孽。
  • function_body: 函數(shù)體,函數(shù)中需要執(zhí)行的代碼語句塊只怎。
  • result_params_comma_separated: 函數(shù)返回值袜瞬,Lua語言函數(shù)可以返回多個(gè)值,每個(gè)值以逗號(hào)隔開身堡。
--[[ 函數(shù)返回兩個(gè)值的最大值 --]]
function max(num1, num2)

   if (num1 > num2) then
      result = num1;  --心累邓尤,這語言才發(fā)現(xiàn)加上 ; 結(jié)尾一個(gè)語句和不加都可以運(yùn)行
   else
      result = num2;
   end

   return result;
end
-- 調(diào)用函數(shù)
print("兩值比較最大值為 ",max(10,4));
print("兩值比較最大值為 ",max(5,6));
myprint = function(param)
   print("這是打印函數(shù) -   ##",param,"##")
end

function add(num1,num2,functionPrint) --所以參數(shù)其實(shí)傳入什么都可以,只要可以在函數(shù)內(nèi)使用正確就行
   result = num1 + num2
   -- 調(diào)用傳遞的函數(shù)參數(shù)
   functionPrint(result)
end
myprint(10)
-- myprint 函數(shù)作為參數(shù)傳遞
add(2,5,myprint)

函數(shù)也可以有多個(gè)返回值贴谎,只要使用','隔開就好汞扎。

Lua 函數(shù)可以接受可變數(shù)目的參數(shù),和 C 語言類似赴精,在函數(shù)參數(shù)列表中使用三點(diǎn) ... 表示函數(shù)有可變的參數(shù)佩捞。

  function add(...)  --可以在函數(shù)內(nèi)使用 a = {...}的語句將可變參數(shù)賦值給變量,這樣就可以操作這個(gè)變量來獲取蕾哟,諸如訪問每一個(gè)參數(shù)一忱,獲取程度等操作
  local s = 0  
    for i, v in ipairs{...} do   --> {...} 表示一個(gè)由所有變長(zhǎng)參數(shù)構(gòu)成的數(shù)組  
      s = s + v  
    end  
    return s  
  end  
  print(add(3,4,5,6,7))  --->25

我們可以將可變參數(shù)賦值給一個(gè)變量。

通常在遍歷變長(zhǎng)參數(shù)的時(shí)候只需要使用 {…}谭确,然而變長(zhǎng)參數(shù)可能會(huì)包含一些 nil帘营,那么就可以用 select 函數(shù)來訪問變長(zhǎng)參數(shù)了:select('#', …) 或者 select(n, …)

  • select('#', …) 返回可變參數(shù)的長(zhǎng)度

  • select(n, …) 用于返回 nselect('#',…) 的參數(shù)。select(n, ...) --數(shù)字n表示起點(diǎn)逐哈,select(n, ...)返回從起點(diǎn)n到結(jié)束的可變參數(shù)芬迄,比如:

    n=3,... 是 0昂秃,1禀梳,2,3肠骆,4算途,5

    則 select(n, ...) 就表示...中從第3個(gè)到最后一個(gè)的多個(gè)數(shù):2,3蚀腿,4嘴瓤,5。并且2,3廓脆,4筛谚,5是4個(gè)數(shù),不是列表或其他的數(shù)據(jù)結(jié)構(gòu)停忿。所以驾讲, 下面的代碼中,a = select(3,...) 就表示的是 a = 2,3,4,5瞎嬉。這就相當(dāng)于復(fù)制變量大于值的情況蝎毡,所以厚柳,a=2氧枣。

調(diào)用select時(shí),必須傳入一個(gè)固定實(shí)參selector(選擇開關(guān))和一系列變長(zhǎng)參數(shù)别垮。如果selector為數(shù)字n,那么select返回它的第n個(gè)可變實(shí)參便监,否則只能為字符串"#",這樣select會(huì)返回變長(zhǎng)參數(shù)的總數(shù)。

function mytest(a, ...) --可變實(shí)參和普通參數(shù)可以混用
    local t = select('#', ...) --獲取可變實(shí)參的長(zhǎng)度
    print(t)
    local b = {...}--將可變實(shí)參傳遞給變量碳想,然后通過變量訪問其內(nèi)容烧董,但是這樣如果訪問越界不會(huì)報(bào)錯(cuò)
    print(b[1])
end
mytest(5, 6, 7, 8)
do  
    function foo(...)  
        for i = 1, select('#', ...) do  -->獲取參數(shù)總數(shù)
            local arg = select(i, ...); -->讀取參數(shù) 采取這樣的方式可以讀取可變實(shí)參而不會(huì)越界
            print("arg", arg);  
        end  
    end  
 
    foo(1, 2, 3, 4);  
end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胧奔,隨后出現(xiàn)的幾起案子逊移,更是在濱河造成了極大的恐慌,老刑警劉巖龙填,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胳泉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡岩遗,警方通過查閱死者的電腦和手機(jī)扇商,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宿礁,“玉大人案铺,你說我怎么就攤上這事“鹁福” “怎么了控汉?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)返吻。 經(jīng)常有香客問我姑子,道長(zhǎng),這世上最難降的妖魔是什么思喊? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任壁酬,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舆乔。我一直安慰自己岳服,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布希俩。 她就那樣靜靜地躺著吊宋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颜武。 梳的紋絲不亂的頭發(fā)上璃搜,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音鳞上,去河邊找鬼这吻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛篙议,可吹牛的內(nèi)容都是我干的唾糯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鬼贱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼移怯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起这难,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤舟误,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姻乓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嵌溢,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年糖权,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堵腹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡星澳,死狀恐怖疚顷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禁偎,我是刑警寧澤腿堤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站如暖,受9級(jí)特大地震影響笆檀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盒至,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一酗洒、第九天 我趴在偏房一處隱蔽的房頂上張望士修。 院中可真熱鬧,春花似錦樱衷、人聲如沸棋嘲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沸移。三九已至,卻和暖如春侄榴,著一層夾襖步出監(jiān)牢的瞬間雹锣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工癞蚕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕊爵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓涣达,卻偏偏與公主長(zhǎng)得像在辆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子度苔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345