2016-08-26 85 views
0

我有下面的代碼片段設置一個全球性的要求

function initializeWorld() 
    _G.require = function(name) 
      if package.loaded[name] == nil then 
        local result, err = external.MyAPIEndpoint:LUAInclude(name .. '.lua') 
        if err == nil then 
         if result ~= nil then 
           package.loaded[name] = result 
         else 
           package.loaded[name] = true 
         end 

         return package.loaded[name] 
        else 
         local errTxt = err .. "\r\n" .. debug.traceback() 
         error(errTxt, 1) 
        end 
      else 
        return package.loaded[name] 
      end 
    end 

    helloWorld = require ("helloWorld") 
    print(helloWorld.welcome()) 
end 

function initializeUniverse() 
    _G.require = function(name) 
      if package.loaded[name] == nil then 
        local result, err = external.MyAPIEndpoint:LUAInclude(name .. '.lua') 
        if err == nil then 
         if result ~= nil then 
           package.loaded[name] = result 
         else 
           package.loaded[name] = true 
         end 

         return package.loaded[name] 
        else 
         local errTxt = err .. "\r\n" .. debug.traceback() 
         error(errTxt, 1) 
        end 
      else 
        return package.loaded[name] 
      end 
    end 

    helloUniverse = require ("helloUniverse") 

    print(helloUniverse.welcome()) 

end 

正如你可以看到global requires在兩個不同的地方使用。一次在initializeWorld,另一個在initializeUniverse

我可以對代碼進行修改,使其只加載一次嗎?

感謝

+0

將它從最後調用的哪個函數中刪除?如果它是競爭條件,請在外部定義它(可能有條件地將它加載到兩者中)。 – Oka

+0

'local local_require = function(name)... end;函數initializeWorld()_G.require = local_require; ... 結束;函數initializeUniverse()_G.require = local_require; ...結束;' –

回答

1

你或許不應該覆蓋全球require功能。如果你想運行第三方或用戶代碼,你可以沙盒,否則你可以簡單地使用不同的名稱,如my_require()load_awesome_stuff()

我會假設你不知道哪兩個函數initializeWorld()initializeUniverse()被稱爲第一,雖然這種解決方案無論哪種方式。

只需在某個名字下定義函數,無論你最喜歡哪一個,但是如果可能的話,避免全局的require,在某些時候你可以確定它在這兩個初始化函數之前運行。然後你可以在它們兩個中使用它。如果你想把它叫做require,你可以直接在函數體內定義它,如local require = my_require; require "some_stuff"

+0

謝謝..我現在知道我需要做什麼 - 再次感謝。 – Gagan