lua内嵌执行string

我们都知道loadstring可以把字符串加载成function,然而,local变量和upvalue变量却不能被传入这个function。

因此“script”函数应运而生,先上代码:

function script(s)
    local prefix,suffix = "",""
    local function lcpairs(l)
        l = l or 2
        local i = 0
        return function()
            i = i + 1
            local n,v = debug.getlocal(l,i)
            return n and i, n, v
        end
    end
    local function insertvalue(i,n,v)
        prefix = prefix..("local %s = %s\n"):format(n,stringify(v))
        suffix = suffix..("debug.setlocal(2,%s,%s)\n"):format(i,n)
    end
    for i,n,v in lcpairs(3) do
        insertvalue(i,n,v)
    end
    local codes = prefix..s..suffix
    return loadstring(codes)
end

local a = "sss"
script[[
    print("a",a)
    a = "good!!!"
]]() --a  sss
print("a",a) --a  good!!!

 

说明:

  stringify的作用是任意对象转换成字符串,详情参考上一篇

posted on 2017-10-26 01:58  飞天里欧斯  阅读(1051)  评论(0编辑  收藏  举报

导航