最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua面向?qū)ο缶幊虒W(xué)習(xí)筆記

 更新時(shí)間:2014年12月10日 11:38:36   投稿:junjie  
這篇文章主要介紹了Lua面向?qū)ο缶幊虒W(xué)習(xí)筆記,本文講解了Lua中實(shí)現(xiàn)類的例子、類之間繼承的例子等內(nèi)容,需要的朋友可以參考下

其實(shí) Lua 中的 table 是一種對象,因?yàn)樗鷮ο笠粯?,有其自己的操作方法?/p>

復(fù)制代碼 代碼如下:

Role = { hp = 100 }
function Role.addHp(hp)
    Role.hp = Role.hp + hp
end
 
Role.addHp(50)
print(Role.hp)

上面代碼創(chuàng)建了一個(gè)名為 Role 對象,并有一個(gè) addHp 的方法,執(zhí)行 "Role.addHp" 便可調(diào)用 addHp 方法。

不過上面對象 Role 是以全局變量的方式創(chuàng)建,會有一種“全局污染”的威脅,即變量 Role 在其他地方被重新賦值(例如被賦成 nil),對象里的屬性或方法可能會面臨被銷毀或不能正常工作的情況。

對于這種問題,Lua 提供一種“接受者”的解決方法,即額外添加一個(gè)參數(shù) self 來表示對象本身:

復(fù)制代碼 代碼如下:

Role = { hp = 100 }
function Role.addHP(self, hp)
    self.hp = self.hp + hp
end
r = Role
r.addHP(r, 50)
print(r.hp)

這樣就不怕對象 Role 被“全局污染”,因?yàn)闃?gòu)造了一個(gè)子對象 r,并以參數(shù)的方式傳入,以供其方法調(diào)用操作。

對于這種把對象本身以參數(shù)的方式傳入對象方法里的寫法,Lua 提供了一種更優(yōu)雅的寫法,把點(diǎn)號(.)替換為冒號(:),這樣在方法定義或調(diào)用時(shí),便可隱藏 self 參數(shù)。修改如下:

復(fù)制代碼 代碼如下:

Role = { hp = 100 }
function Role:addHp(hp)
    self.hp = self.hp + hp
end
r = Role
r:addHp(50)
print(r.hp)

上面的 "r.addHp(50)" 的寫法等價(jià)于 "r.addHp(r, 50)"

Lua 沒有類的概念,不過可以通過元表(metatable)來實(shí)現(xiàn)與原型 prototype 類似的功能,而 prototype 與類的工作機(jī)制一樣,都是定義了特定對象行為。Lua 里的原型特性主要使用元表的 __index 事件來實(shí)現(xiàn),這樣當(dāng)調(diào)用對象沒定義的方法時(shí),會向其元表的 __index 鍵(事件)查找。例如有 a 和 b 兩個(gè)對象,想讓 b 作為 a 的原型 prototype,只需要把 b 設(shè)置為 a 元表的 __index 值就行:

復(fù)制代碼 代碼如下:

setmetatable(a, {__index = b})

這樣,當(dāng)對象 a 調(diào)用任何不存在的成員都會到對象 b 中查找,a 可以擁有或調(diào)用 b 的屬性或方法,從某種意義上看,b 可以看作是一個(gè)類,a 是 b 的對象。

對于上面 Role 的例子,對象的創(chuàng)建可以用 __index 元方法來改寫,這樣新創(chuàng)建的對象就擁有和 Role 一樣的屬性和方法。

復(fù)制代碼 代碼如下:

function Role:new(o)
    o = o or {} 
    setmetatable(o, self)
    self.__index = self
    return o
end

當(dāng)執(zhí)行 "r = Role:new() " 創(chuàng)建一個(gè)對象時(shí),r 將 Role 設(shè)置為自己的元表,那么調(diào)用 "r:addHp(50)" 的時(shí)候,會在 r 里查找 addHp 方法,如果沒有找到,則會進(jìn)一步搜索其元表的 __index,因此等價(jià)于:

復(fù)制代碼 代碼如下:

getmetatable(r).__index.addHp(r, 50)

從上面的 Role:new 方法可以知道,Role 的 __index 在創(chuàng)建時(shí)被指定為 self,因此其實(shí)就是執(zhí)行:

復(fù)制代碼 代碼如下:

Role.addHp(R, 50)

完整的類例子:

復(fù)制代碼 代碼如下:

Role = { hp = 100 }
function Role:new(o)
    o = o or {} 
    setmetatable(o, self)
    self.__index = self
    return o
end
function Role:addHp(hp)
    self.hp = self.hp + hp
end
 
r = Role:new()
r:addHp(50)
print(r.hp)

繼承

Lua 里繼承機(jī)制還是像實(shí)現(xiàn)類那樣實(shí)現(xiàn)。

假如打算從類 Role 派生出一個(gè)子類 Priest,它有一個(gè)魔法屬性值 mp,那么可以先從類 Role 構(gòu)造一個(gè) Priest,繼承類 Role 的所有屬性和方法:

復(fù)制代碼 代碼如下:

Priest = Role:new()

雖然 Priest 是 Role 的一個(gè)實(shí)例,不過它具有類 Role 的所有屬性和方法,其實(shí)也可以把它看做是從類 Role 派生出來的類,因此可以從類 Priest 繼續(xù) new 一個(gè)對象出來:

復(fù)制代碼 代碼如下:

p = Priest:new({ mp = 100 })

上面實(shí)例 p 除了多出一個(gè)魔法屬性值 mp 外,還繼承類 Role 的所有屬性和方法,當(dāng)調(diào)用 "p.addHp" 方法時(shí),Lua 在 p 中找不到 addHp 方法,會到 Priest 中找,在 Priest 中找不到,會到 Role 中找。

因此,想重定義從父類 Role 繼承來的方法,在類 Priest 上定義即可。假如想重定義 addHp 方法:每次加血都要先判斷魔法值夠不夠,如果夠,則加血,并扣除一定的魔法值。修改如下:

復(fù)制代碼 代碼如下:

function Priest:addHp(hp)
    if self.mp >= 20 then
        self.mp = self.mp - 20
        self.hp = self.hp + hp
    end
end

這樣,當(dāng)調(diào)用 "p:addHp" 時(shí),Lua 會優(yōu)化取類 Priest 定義的 addHp 方法。

相關(guān)文章

  • Lua中的loadfile、dofile、require詳解

    Lua中的loadfile、dofile、require詳解

    這篇文章主要介紹了Lua中的loadfile、dofile、require詳解,本文分別用實(shí)例講解它的用法和特點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua極簡入門指南(六):模塊

    Lua極簡入門指南(六):模塊

    這篇文章主要介紹了Lua極簡入門指南(六):模塊,本文講解了require函數(shù)、編寫模塊、查找模塊等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Lua中的迭代器(iterator)淺析

    Lua中的迭代器(iterator)淺析

    這篇文章主要介紹了Lua中的迭代器(iterator)淺析,本文講解了pairs迭代器和、ipairs迭代器,同時(shí)提及了io.lines、string.gmatch、迭代器與Closure(閉包)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中訪問table里函數(shù)的方法示例

    Lua中訪問table里函數(shù)的方法示例

    這篇文章主要介紹了Lua中訪問table里函數(shù)的方法示例,本文例子超級簡單,算是入門實(shí)例吧,其實(shí)只需要表名.方法名即可訪問,重要的還是其它代碼寫法,本文給出了一個(gè)完整的代碼示例,需要的朋友可以參考下
    2015-04-04
  • Lua 中 pairs 和 ipairs 的區(qū)別

    Lua 中 pairs 和 ipairs 的區(qū)別

    這篇文章主要介紹了Lua 中 pairs 和 ipairs 的區(qū)別,本文用官方文檔和代碼實(shí)例總結(jié)了它的們的區(qū)別,需要的朋友可以參考下
    2014-09-09
  • Lua性能優(yōu)化技巧(五):削減、重用和回收

    Lua性能優(yōu)化技巧(五):削減、重用和回收

    這篇文章主要介紹了Lua性能優(yōu)化技巧(五):削減、重用和回收,本文用多個(gè)實(shí)例講解了這三個(gè)優(yōu)化技巧,需要的朋友可以參考下
    2015-04-04
  • Lua中的一些常用函數(shù)庫實(shí)例講解

    Lua中的一些常用函數(shù)庫實(shí)例講解

    這篇文章主要介紹了Lua中的一些常用函數(shù)庫實(shí)例講解,本文講解了數(shù)學(xué)庫、table庫、字符串庫、I/O庫等常用函數(shù)庫,需要的朋友可以參考下
    2014-09-09
  • Lua5.1中加載dll動(dòng)態(tài)鏈接庫的方法

    Lua5.1中加載dll動(dòng)態(tài)鏈接庫的方法

    這篇文章主要介紹了Lua5.1中加載dll動(dòng)態(tài)鏈接庫的方法,本文講解了加載專門為lua寫的擴(kuò)展dll的方法和加載不是專為lua寫的擴(kuò)展dll的方法,需要的朋友可以參考下
    2015-05-05
  • Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques)

    Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques)

    這篇文章主要介紹了Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques),本文講解了11個(gè)關(guān)于元編程的技術(shù)和技巧,需要的朋友可以參考下
    2015-04-04
  • 淺析Lua編程中的異常處理

    淺析Lua編程中的異常處理

    這篇文章主要介紹了淺析Lua編程中的異常處理,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,要的朋友可以參考下
    2015-05-05

最新評論

昌邑市| 乌鲁木齐市| 万载县| 涞水县| 扬州市| 巴马| 吴桥县| 宝兴县| 辉南县| 房产| 铜鼓县| 奎屯市| 喀喇沁旗| 和政县| 无锡市| 耿马| 荃湾区| 台前县| 汉寿县| 金堂县| 阳西县| 九龙城区| 永安市| 聂荣县| 安徽省| 化州市| 沙坪坝区| 商丘市| 合阳县| 冕宁县| 达尔| 游戏| 和田市| 阳春市| 南安市| 内黄县| 泉州市| 通辽市| 库尔勒市| 磴口县| 沐川县|