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

Lua 極簡入門指南(七):面向?qū)ο缶幊?/h1>
 更新時間:2014年11月03日 09:09:41   投稿:junjie  
這篇文章主要介紹了Lua 極簡入門指南(七):面向?qū)ο缶幊?本文講解了類和繼承的概念,并給出了編程實例,需要的朋友可以參考下

在很多面向?qū)ο蟮恼Z言中有類(class)的概念,對象是類的實例。Lua 中不存在類的概念。Lua 就像 JavaScript 一樣是面向原型的語言(http://en.wikipedia.org/wiki/Prototype-based_programming),這類語言使用一個對象表示一個“類”,其他對象(此類的實例)使用此對象作為原型。我們有兩個 table p 和 obj,將 p 設(shè)置為 obj 的原型(回顧:http://www.fzitv.net/article/56690.htm):

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

setmetatable(obj, {__index = p})

obj 中不存在的操作會在 p 中查找。

看一個詳細(xì)的例子:

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

Account = {
    -- 默認(rèn)的 balance 的值
    balance = 0
}
 
function Account:new(o)
    o = o or {}
    -- 設(shè)置原型為 Account
    setmetatable(o, self)
    self.__index = self
    return o
end
 
function Account:deposit(v)
    self.balance = self.balance + v
end
 
function Account:withdraw(v)
    if v > self.balance then
        print('insufficient funds')
        return
    end
    self.balance = self.balance - v
end
 
-- 構(gòu)建 Account 對象,初始 balance 為 100
local a1 = Account:new{balance = 100}
a1:deposit(100)    --> balance == 200
a1:withdraw(100)   --> balance == 100
 
-- 構(gòu)建 Account 對象,使用默認(rèn)的 balance
local a2 = Account:new()
a2:deposit(100)    --> balance == 100

在方法定義時使用冒號能夠添加一個隱藏的參數(shù) self 給方法,在方法調(diào)用時使用冒號能夠?qū)⒄{(diào)用者作為一個額外的參數(shù)傳遞給此方法,例如:

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

-- 以下兩種寫法等價
function Account:deposit(v)
function Account.deposit(self, v)
 
-- 以下兩種寫法等價
a1:deposit(100)
a1.deposit(a1, 100)

self 為方法的調(diào)用者。

在 Account 這個例子中,一個小優(yōu)化是,我們沒有必要創(chuàng)建一個額外的 metatable,而直接使用 Account 作為 metatable。

繼承

我們通過一個例子來解釋 Lua 如何實現(xiàn)繼承。假定我們需要子類 SpecialAccount 繼承于 Account,SpecialAccount 是可以透支的。

首先構(gòu)造一個子類:

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

SpecialAccount = Account:new()

這里 SpecialAccount 擁有了(繼承了)Account 的 new 方法。那么我們就可以使用 SpecialAccount 構(gòu)建對象:
復(fù)制代碼 代碼如下:

local sa = SpecialAccount:new{limit = 1000}
sa:withdraw(100)

這里通過 SpecialAccount:new 構(gòu)造了對象 sa,并且 sa 的 metatable 為 SpecialAccount。執(zhí)行 sa:withdraw(100),Lua 在 sa 中找不到 withdraw,就會在 SpecialAccount 中找,在 SpecialAccount 中也找不到 withdraw,然后在 Account 中找到 withdraw 并調(diào)用它。Account 中的 withdraw 顯然不是我們想要的,我們在 SpecialAccount 中重新定義它:

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

function SpecialAccount:withdraw(v)
    if v - self.balance >= self:getLimit() then
        print('insufficient funds')
        return
    end
    self.balance = self.balance - v
end
 
function SpecialAccount:getLimit()
    return self.limit or 0
end

我們再調(diào)用 sa:withdraw(100),Lua 先在 SpecialAccount 中找到 withdraw 并調(diào)用它。

相關(guān)文章

  • Lua模塊與包學(xué)習(xí)筆記

    Lua模塊與包學(xué)習(xí)筆記

    這篇文章主要介紹了Lua模塊與包學(xué)習(xí)筆記,本文講解了加載模塊、加載機(jī)制等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • 深入解讀Lua中迭代器與泛型for的使用

    深入解讀Lua中迭代器與泛型for的使用

    在Lua中,迭代器常被寫為函數(shù)而被調(diào)用返回下一個元素,而for循環(huán)調(diào)用迭代器函數(shù)則使得迭代更強(qiáng)強(qiáng)大,下面我們就來深入解讀Lua中迭代器與泛型for
    2016-06-06
  • Lua獲取文件長度和判斷文件是否存在函數(shù)分享

    Lua獲取文件長度和判斷文件是否存在函數(shù)分享

    這篇文章主要介紹了Lua獲取文件長度和判斷文件是否存在函數(shù)分享,需要的朋友可以參考下
    2015-04-04
  • Lua中操作字符串的基本方法整理

    Lua中操作字符串的基本方法整理

    這篇文章主要介紹了Lua中操作字符串的基本方法整理,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • Lua性能優(yōu)化技巧(六):最后的提示

    Lua性能優(yōu)化技巧(六):最后的提示

    這篇文章主要介紹了Lua性能優(yōu)化技巧(六):最后的提示,本文是系列文章的最后一篇,其它文章請參考本文的相關(guān)文章,需要的朋友可以參考下
    2015-04-04
  • Lua中模塊以及實現(xiàn)方法指南

    Lua中模塊以及實現(xiàn)方法指南

    從Lua 5.1開始,我們可以使用require和module函數(shù)來獲取和創(chuàng)建Lua中的模塊。從使用者的角度來看,一個模塊就是一個程序庫,可以通過require來加載,之后便得到一個類型為table的全局變量。
    2015-04-04
  • Lua和C++語言的交互詳解

    Lua和C++語言的交互詳解

    這篇文章主要介紹了Lua和C++語言的交互詳解,本文講解了C++和Lua交互,涉及到獲取Lua中普通變量的值,Lua中table的值和調(diào)用Lua中的函數(shù),需要的朋友可以參考下
    2014-09-09
  • Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究

    這篇文章主要介紹了Lua中的協(xié)同程序之resume-yield間的數(shù)據(jù)返回研究本文講解了resume的參數(shù)、resume函數(shù)的第二個返回值、yield的返回值等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中的運算符簡明總結(jié)

    Lua中的運算符簡明總結(jié)

    這篇文章主要介紹了Lua中的運算符簡明總結(jié),本文總結(jié)了數(shù)學(xué)運算符、連接運算、賦值運算、 邏輯運算、關(guān)系運算等運算符,需要的朋友可以參考下
    2014-10-10
  • Lua和C++的通信流程分解

    Lua和C++的通信流程分解

    這篇文章主要介紹了Lua和C++的通信流程分解,本文用一張圖講解了Lua和C++之間的通信流程,并對每一步做了分解,需要的朋友可以參考下
    2014-09-09

最新評論

南岸区| 呼伦贝尔市| 阜宁县| 乳山市| 天镇县| 霞浦县| 田林县| 石嘴山市| 金阳县| 南郑县| 襄垣县| 日喀则市| 本溪| 孝义市| 许昌市| 临清市| 柘城县| 平武县| 临高县| 丹棱县| 湘阴县| 甘洛县| 河津市| 寻甸| 镇巴县| 文成县| 文水县| 玉林市| 建始县| 饶河县| 广灵县| 洛阳市| 兴隆县| 哈巴河县| 黎平县| 于都县| 曲阳县| 灵山县| 平凉市| 苍山县| 耒阳市|