Lua 學(xué)習(xí)筆記

最近要用到 Lua 編程語(yǔ)言,所以學(xué)習(xí)了一些簡(jiǎn)明教程敏簿,同時(shí)記錄一下 Lua 編程語(yǔ)言相對(duì)于其他主流編程語(yǔ)言在語(yǔ)法上特殊的地方锣吼。其中女嘲,在 Lua 中使用Table數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)“面向?qū)ο蟆本幊淌侵攸c(diǎn)募狂。

注釋

-- 單行注釋
--[[
塊注釋办素,有趣的是這個(gè)注釋標(biāo)記不是對(duì)稱的
--]]

變量

  1. 變量沒(méi)有類型,值才有類型祸穷,也就是在聲明變量的時(shí)候不需要聲明變量的類型性穿。
  2. 數(shù)字只有 double 類型 。
  3. 沒(méi)有定義過(guò)的變量值為 nil雷滚。
  4. 對(duì)于布爾類型需曾,只有 nilfalse 表示假,其他的值都為真。
  5. 默認(rèn)變量都是全局變量胯舷,局部變量需要加 local 關(guān)鍵字

操作符

  1. Lua 中沒(méi)有 +++= 這類的運(yùn)算符
  2. 不等于號(hào)是 ~=
  3. 字符串鏈接符是 ..
  4. 條件表達(dá)的“與”刻蚯、“或”、“非”分別是and,or,not

控制語(yǔ)句

if-else 分支

i = 10
if i = 0 then
-- do something
elseif i > 5 and i < 10 then
-- do something
else
-- do something 
end

while 循環(huán)

i = 0
while i < 100 do
  -- do something
  i = i + 1
end

until 循環(huán)

sum = 2
repeat
  sum = sum ^ 2
until sum > 100

for 循環(huán)

for i=1, 100, 2 do
-- do something
end

函數(shù)

函數(shù)可以作為返回值返回

function add(x)
  return function(y) y + x end
end

addOne = add(1)
addOne(1) -- 2

可以返回多個(gè)值桑嘶,同時(shí)默認(rèn)為全局函數(shù)。

值得注意的是 Lua 的函數(shù)參數(shù)不支持默認(rèn)值躬充,這也為 Lua 程序的重構(gòu)帶來(lái)了一些麻煩逃顶。

Table

Table 是 Lua 中重要的數(shù)據(jù)結(jié)構(gòu),它是由一系列的 key-value 鍵值對(duì)組成充甚。Lua 中的數(shù)組也是一種特殊的 Table以政,它下標(biāo)從 1 開(kāi)始,而且在一個(gè)數(shù)組中可以有不同類型的成員伴找。

變量對(duì)于 Table 的引用是弱引用盈蛮,也就是說(shuō) Table 是獨(dú)立于變量存在的,只有當(dāng)沒(méi)有任何一個(gè)變量引用這個(gè) Table 的時(shí)候技矮,Lua 的垃圾回收機(jī)制才會(huì)把這個(gè) Table 從內(nèi)存中回收抖誉。這個(gè)特性對(duì)于在 Lua 中實(shí)現(xiàn)“面向?qū)ο蟆币埠苤匾?/p>

-- 定義和訪問(wèn)
person = {name = "jack", age =24}
person.name = "black"
person.age = 20

-- 另一種定義和訪問(wèn)
person2 = {['name']="green", ['age']=30}
person2['name'] = "tom"
person2['age'] = 10

-- 數(shù)組
arr = {1,2,3,4,5}
arr = {[1]=1,[2]=2,[3]=3,[4]=4,[5]=5} -- 與上面的定義等價(jià)

MetaTable 和 MetaMethod

Lua 中每個(gè)值都有一套預(yù)定義的操作集合,這個(gè)集合就是 MateTable 衰倦,MetaTable 中預(yù)定義的方法就是 MetaMethod袒炉。tableuserdata 有各自獨(dú)立的 MetaTable,從而可以利用這一特性實(shí)現(xiàn)“面向?qū)ο蟆本幊谭恪6渌愋偷闹祫t共享屬于該類型的一個(gè) MetaTable我磁。

面向?qū)ο?/h1>

Lua 可以通過(guò)使用 Table 這種數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)面向?qū)ο缶幊獭5沁@種面向?qū)ο蟛⒉皇腔陬悾?code>Class)的驻襟,而是基于原型(prototype)的夺艰。這個(gè)原型就是我們定義好的一個(gè) Table,其他對(duì)象就可以通過(guò)這個(gè)原型衍生出來(lái)沉衣。

定義原型

首先定義一個(gè) Table 當(dāng)作我們的原型郁副,并定義一個(gè)成員變量

Account = { balance = 0 }

這樣原型就定義好了,由于 Table 是獨(dú)立于變量存在的厢蒜, 只要不把 Account 變量設(shè)為 nil 霞势,那么就這個(gè)原型就一直存在。在這個(gè)原型中有一個(gè) balance 的成員變量斑鸦。

定義成員方法

緊接上面的代碼愕贡,我們可以定義一個(gè)成員方法

function Account.withdraw(self, v)
  self.balance = self.balance - v
end

其中 Account.withdraw 是一個(gè)語(yǔ)法糖, 相當(dāng)于在 Account 的 Table 中定義了一個(gè) withdraw 的字段巷屿,而它的內(nèi)容就是一個(gè)方法固以,上面的寫法等價(jià)于:

Account = {
  withdraw = function (self, v)
    self.balance = self.balance - v
  end 
}

在這個(gè)方法中使用了 self 關(guān)鍵字,它就是指這個(gè) Table 本身,它有可能是這個(gè)原型憨琳,也可能是由這個(gè)原型衍生出的對(duì)象诫钓。

同時(shí)我們可以在定義成員方法時(shí)使用 : 語(yǔ)法糖,默認(rèn)傳入 self 提高編碼效率篙螟。例如:

function Account:withdraw(v)
 self.balance = self.balance - v
end

生成對(duì)象

對(duì)象其實(shí)也是一個(gè) Table , 只不過(guò)這個(gè) Table 并不是空的菌湃,而是基于一個(gè)原型產(chǎn)生的”槁裕基于原型的 Table 就是利用上面的 MetaTable 來(lái)實(shí)現(xiàn)的惧所。同樣基于上面的代碼實(shí)現(xiàn)一個(gè)產(chǎn)生基于 Account 原型的對(duì)象的方法new

function Account:new(o)
  if o == nil then
    o = {}
  end
  
  setmetatable(o, self) -- 綁定原型

  self.__index = self --索引原型,方便使用點(diǎn)號(hào)

  return o
end

這個(gè)方法的關(guān)鍵就是在對(duì)象的 MetaTable 中添加了原型 Account绪杏。這樣當(dāng)我們要訪問(wèn)對(duì)象 o 這個(gè)中的某個(gè)未定義的字段時(shí)下愈,Lua 就會(huì)去查找它的 MetaTable 中是否有這個(gè)字段,由于我們綁定了原型蕾久,這樣就能找到原型中的這個(gè)字段势似。比如,我們并沒(méi)有為 o 定義 withdraw 方法僧著,所以當(dāng)我們?cè)L問(wèn) o 的 withdraw 字段時(shí)履因,就會(huì)發(fā)現(xiàn) o 本身的 Table 并沒(méi)有這個(gè)字段,然后去查找它的 MetaTable霹抛,這樣就能訪問(wèn)到原型搓逾,也就是 Accountwithdraw 的實(shí)現(xiàn)。

派生

由原有的原型派生出新的原型在 Lua 中實(shí)現(xiàn)起來(lái)也不難杯拐,因?yàn)樵鸵彩?Table霞篡, 我們只要為這個(gè) Table 添加新的字段,或者為原有字段定義新的內(nèi)容就行了端逼,例如:

SpecialAccount = Account:new{limit = 100}

-- 重新定義 withdraw 方法
function SpecialAccount:withdraw(v)
  if v < self.limit then
    self.balance = self.balance - v
  end
end

在上面的代碼中就從 Account 原型中派生出了一個(gè)新的原型朗兵,其中添加了一個(gè)新的limit成員變量和重新定義了withdraw成員方法。

參考資料

  1. LUA簡(jiǎn)明教程
  2. Lua 5.1 參考手冊(cè)
  3. Lua 程序設(shè)計(jì)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顶滩,一起剝皮案震驚了整個(gè)濱河市余掖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礁鲁,老刑警劉巖盐欺,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仅醇,居然都是意外死亡冗美,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門析二,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粉洼,“玉大人节预,你說(shuō)我怎么就攤上這事∈羧停” “怎么了安拟?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宵喂。 經(jīng)常有香客問(wèn)我糠赦,道長(zhǎng),這世上最難降的妖魔是什么锅棕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任愉棱,我火速辦了婚禮,結(jié)果婚禮上哲戚,老公的妹妹穿的比我還像新娘。我一直安慰自己艾岂,他們只是感情好顺少,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著王浴,像睡著了一般脆炎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氓辣,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天秒裕,我揣著相機(jī)與錄音,去河邊找鬼钞啸。 笑死几蜻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的体斩。 我是一名探鬼主播梭稚,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼絮吵!你這毒婦竟也來(lái)了弧烤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹬敲,失蹤者是張志新(化名)和其女友劉穎暇昂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體伴嗡,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡急波,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闹究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔崖。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赏寇,到底是詐尸還是另有隱情吉嫩,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布嗅定,位于F島的核電站自娩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏渠退。R本人自食惡果不足惜忙迁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碎乃。 院中可真熱鬧姊扔,春花似錦、人聲如沸梅誓。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梗掰。三九已至嵌言,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間及穗,已是汗流浹背摧茴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埂陆,地道東北人苛白。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猜惋,于是被迫代替她去往敵國(guó)和親丸氛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.1程序塊:Lua執(zhí)行的每段代碼著摔,例如一個(gè)源代碼文件或者交互模式中輸入的一行代碼缓窜,都稱為一個(gè)程序塊 1.2注釋:...
    c_xiaoqiang閱讀 2,588評(píng)論 0 9
  • 1、loadstring谍咆、dofile和loadfile的用法和區(qū)別: (1)對(duì)loadstring禾锤,程序示例如下...
    陳振擁閱讀 508評(píng)論 0 2
  • lua C api PS:這里是默認(rèn)我已經(jīng)學(xué)完了lua腳本的基本知識(shí)(包括table,元表摹察,函數(shù)恩掷,基本庫(kù), 文件i...
    綠箭ML閱讀 3,444評(píng)論 0 1
  • 最近項(xiàng)目要用的lua 所以抽空學(xué)習(xí) 記錄一下 IDE有ZeroBrane Studio 我還是用的sublime...
    slimsallen閱讀 652評(píng)論 3 1
  • 換了一種紙供嚎,有點(diǎn)把控不了的感覺(jué)黄娘!
    夏又幽閱讀 176評(píng)論 0 0