lua語言的幾點技巧

2021-07-15 08:29:43 字數 1747 閱讀 5745

寫了將近兩年的lua語言,一直都在openresty框架下面進行開發,總結了幾點lua語言的技巧記錄下來,也給大家提供一些參考,有什麼不對的地方可以一起討論。

1.如果是一些經常用到的全域性函式,可以申明為local區域性變數,這樣可以提公升效率。

例如ipairs,pairs申明成local的,原因是local變數是存放在lua的堆疊裡面的是array操作,而全域性變數是存放在_g中的table中,效率不及堆疊

如果被多次執行呼叫的全域性變數,就需要考慮用local來申明

2.loadfile()只會編譯不會執行,如果想用loadfile來執行的話,需要將loadfile的函式設定在乙個全域性變數下面的乙個子變數(模組)中

_g._importmodule = _g._importmodule or {}

local _importmodule = _g._importmodule

local pathfile = "test2.lua"

local func, err = loadfile(pathfile)

local a = {}

setmetatable(a, )

setfenv(func, a)() -- 等於 setfenv(func, a), func()

a.test2()

3.xpcall和pcall區別

xpcall:多提供乙個形參來表示表示錯誤處理引數

debug.debug:提供乙個lua提示符,定義錯誤的等級

debug.traceback:根據呼叫桟來構建乙個擴充套件的錯誤訊息 

pcall:沒有那個錯誤處理引數,只知道執行錯誤,不會根據錯誤處理引數列印錯誤結果

兩者都是提供了lua函式的保護執行機制

4.module(...,package.seeall)的含義

module語句的功能可以通過以下語句來表示:

1.設定乙個空的 table,local table = {}

2._g[modulename] = table

3.package.loaded[modulename]=table

如果module(...,package.seeall)加上了package.seeall引數,則可以這樣理解:

4.setmetatable(table,)

5.setfenv(1,table):設定當前函式的執行環境都為table,這樣下面定義的函式和變數就不用寫table.***了

現在一般定義模組不提倡使用module來定義了,一般認為使用module模組會汙染全域性環境變數,同時也破壞了模組的高內聚,因為模組內也可以讀寫全域性屬性

5.__index和__newindex區別

__index:設定元表時,可以通過setmetatable(table1,),這樣相當於table1中查詢不到的元素會在table2中查詢

__newindex:用於更新設定本表不存在的元素屬性時,

如果__newindex是乙個函式,則在給table不存在的字段賦值時,會呼叫這個函式。

如果__newindex是乙個table,則在給table不存在的字段賦值時,會直接給__newindex的table賦值

6.rawget和rawset的功能

通過這兩個字段可以單純的給本表獲取值和賦值,而不通過元表中的__index和__newindex屬性

可以通過__newindex來設定唯讀表,構造乙個方法傳入乙個table,讓乙個設定乙個空表的__index來指向這個table,同時這個設定__newindex屬性

寫好軟文的幾點技巧

軟文就是廣告,寫軟文的最終目的就是賣產品,另外軟文也是一種需求,或者提公升品牌知名度。現在消費者都有免疫廣告的,軟文是提高產品隱性宣傳,提高對 或者產品的知名度,增加讓使用者了解產品的目的性。軟文是給消費者一種傳遞資訊,軟文的最終目的是把產品傳輸給客戶,同時也是讓使用者對我們的產品增加信任度和需求。...

Ksh的幾點小技巧

在乙個函式 function 中,如果不希望區域性變數影響到全域性變數或環境變數,可以用typeset來定義。對於多個引數的函式或指令碼,對多個輸入引數的處理有兩種辦法 while 0 do process 1 shift done while getopts a b c d e e c i g l...

Bottle高效開發的幾點技巧

在 你已經學到一些開發基礎,並想寫你自己的應用了吧?這裡有一些 bottle 開發小技巧可提高你的生產力。預設應用 bottle維護乙個全域性的 bottle 例項的棧,模組層面的函式和修飾器使用棧頂例項作為預設應用。例如 route 修飾器,相當於在預設應用上面呼叫了 bottle.route 方...