lua 模塊化的最佳實踐

教程 shanhuhai 5345℃ 0評論

最近看了下 lua 的模塊化機制,有好幾種實現方式,有些東西都很老舊了,對于新手來說實在沒必要了解了,下面我們直接看看 lua 模塊化的最佳方式。

其實可以參考倉庫 openresty 里提供的各種包,這些包用的都是最佳方式,例如
lua-resty-redis

方式一 通過返回表來實現

local M = {}

function M.play()
    print("開始");
end

function M.quit()
    print("退出")
end

return M;

調用:

local game = require('game')
game.play()   

方式二 在包中定義類

local _M = {}

_M._VERSION = '1.0'

local mt = { __index = _M }

function _M.new(self, width, height )
    return setmetatable({width = width, height = height}, mt)
end

function _M.get_square( self )
    return self.width * self.height
end

return _M

調用:

local square = require('square')
local s1 = square:new(2, 3)
print(s1:get_square())

lua 參數默認值

lua 的函數參數不支持默認值,可以通過間接的方式來實現


function output(msg) msg = msg or "Hello" print(msg) end

setmetatable() 和元表

lua 的面向對象編程中有一個中重要的概念 metatable (元表)。

  • 任何 table 都可以附加元表
  • setmetatable()用來將一個表附給另一個表做元表, 該函數總是返回第一個參數
  • 元表里可以包含任何東西,常用的索引是 __index__newindex
  • 索引對應的值可以是 表或者函數
t = {}  -- 普通表
mt = {} -- 元表暫時為空
t = setmetatable(t, mt) -- 將 mt 設為 t 的元表

__index 索引

先測試一段代碼

_M = {
    name = "shanhuhai"
}
local mt = {__index = _M , name = "yyyy" }
person = setmetatable({},mt)
print(person.name)
print(person['name'])

對照上面的代碼,當我們通過索引來訪問表比如person.name, lua 會先查找當前表已有的索引,接著查找它的元表 mt__index 索引, __index對應的表是 _M , 在 _M 中找到了 name 索引,則返回了對應的值。

__newindex

_N = {
    name = "shanhuhai"
}
person = {
    __index = mt
}

local mt = {__newindex = _N }

person = setmetatable({},mt)

person.sex = 1
print(_N.sex)

對表的索引賦值時,由于在表中找不到 sex 索引,且在元表的 __index 對應的表也找不到對應的索引,這時就會在__newindex 索引對應的表中添加此索引并斌值。

總結

Lua 的 module 有兩種類型:靜態方法提供者,沒有任何私有屬性(方式一);支持面向對象可以保留私有屬性(方式二);真正起到區別作用的就是 setmetatable 函數,是否有自己的個性元表,最終導致兩種不同的形態。

參考文章

http://www.cnblogs.com/xdao/archive/2013/04/02/lua-metatable.html

https://moonbingbing.gitbooks.io/openresty-best-practices/lua/not_use_module.html

https://moonbingbing.gitbooks.io/openresty-best-practices/lua/module_is_evil.html

轉載請注明:大后端 » lua 模塊化的最佳實踐

喜歡 (2)or分享 (0)
發表我的評論
取消評論

表情

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
春梓美 种子,av全裸挂历,日本女护士mm裸照写真,超碰地址发布页 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>