2017-03-27 45 views
1

我想製作一個封裝器,它可以定期加載腳本,但在加載另一個腳本之前刪除以前的腳本數據,加載的腳本應該可以訪問除某些函數之外的所有全局函數,如「print」還應該修改一些功能行爲。 目前我有這樣的代碼:當我想加載一個新的腳本Lua沙盒加載許多腳本

local _print = print 
local _globalFunc = globalFunc 
local env = {} 

function newEnviorment() 
    env = _G 
    env.globalFunc = function() end 
    env.print = function (msg) 
    _print('Wrapper says: '.. msg) 
    end 
    env.Somefunc = function() end 
end 

function loadScript (script) 
    local loaded = loadstring(script) 
    if loaded then 
    setfenv(loaded, env) 
    local ex = pcall(loaded) 
    end 
end 

,我調用這兩個函數,有什麼不對的代碼,如預期這是行不通的。

+0

你能提供預期的行爲嗎?目前您的代碼將覆蓋'_G'對象的屬性 –

+0

我想刪除由腳本創建的變量,一旦創建新環境。 ,我想阻止腳本訪問我創建的下劃線標誌的功能。 – Mostafa

+1

因此,請嘗試使用Egor Skriptunoff答案 - 而不是'env = _G'爲您需要的每個環境創建新對象 –

回答

2
function newEnvironment() 
    env = setmetatable({}, {__index = _G}) 
    env.globalFunc = function() end 
    env.print = function (msg) 
    _print('Wrapper says: '.. msg) 
    end 
    env.Somefunc = function() end 
end 
+0

請添加關於它如何工作的解釋。我還編輯了一個錯字(newEnvironmentment - > newEnvironment) –

+0

@ user465139 - Denis Krasakov已經解釋了OP代碼無法工作的原因。我的答案中的代碼只是針對該問題的一個明顯的解決方案。 –