1. 程式人生 > >lua 熱更新原理(二)

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