lua 熱更新原理(二)
在講lua熱更新原理第二部分之前,先介紹一下lua除錯相關的函式。
除錯函式能夠幫助我們在開發中獲取函式堆疊相關上下文資訊,甚至改變函式的變數。
getinfo ([thread,] f [, what]):
返回關於一個函式資訊的表。 你可以直接提供該函式, 也可以用一個數字 f 表示該函式。 數字 f 表示執行在指定執行緒的呼叫棧對應層次上的函式: 0 層表示當前函式(getinfo 自身); 1 層表示呼叫 getinfo 的函式 (除非是尾呼叫,這種情況不計入棧);等等。 如果 f 是一個比活動函式數量還大的數字, getinfo 返回 nil。
例如程式碼是:
local function myfun() local a = 10 local info = debug.getinfo(1) for k, v in pairs(info) do print(string.format('%20s, %s', k, v)) end end myfun()
可以看到getinfo獲取了諸如函式名,檔名,定義行等資訊。
獲取區域性變數的函式:
debug.getlocal ([thread,] f, local):
此函式返回在棧的 f 層處函式的索引為 local 的區域性變數 的名字和值。 這個函式不僅用於訪問顯式定義的區域性變數,也包括形參、臨時變數等。
local name, val local function myfun(var) local a = 10 local index = 1 g = 108 repeat name, val = debug.getlocal(1, index) print(index, name, val) index = index + 1 until not name end myfun(100)
可以看出getlocal會從函式引數開始依次獲取區域性變數的值,直到為空。
當然我們也可以呼叫setlocal來改變區域性變數,不過在實際的專案中好像並沒有什麼用,如果用setlocal改變區域性變數,幹嘛不直接在程式碼中改變區域性變數呢。
setupvalue (f, up, value):
這個函式將 value 設為函式 f 的第 up 個上值。 如果函式沒有那個上值,返回 nil 否則,返回該上值的名字。
關於函式的上值upvalue,簡單的可以理解為函式引用的非區域性變數。他這個變數也是可以獲取並改變的。例如:
local function ch_up(f, name_, f_) local i = 1 while true do local name, value = debug.getupvalue(f, i) if name == nil then return false end if name == name_ then debug.setupvalue(f, i, f_) return true end i = i + 1 end end local function test() print('raw test') end local wrap_test = function() test() end wrap_test() ch_up(wrap_test, 'test', function() print('new test') end) wrap_test()
可以看到前後兩次執行wrap_test()時,有不同的結果。
以上就是lua動態改變變數的理論基礎,實際專案中還得靈活變通來熱更新程式碼。
參考:
http://www.runoob.com/lua/lua-debug.html