將老版本的函數保存在一個私有的變量中,只用新版本的函數才能訪問它,這樣的技術建立一個安全的運行環境,即所謂的「沙盒(sandbox)」。當執行一些未受信任的代碼時就須要一個安全的運行環境,例如在服務器中執行那些從internet上接收的代碼。下面是個例子:若是要限制一個程序訪問文件的話,只須要使用closure(閉合函數)來重定義函數的io.open:安全
<!-- lang: lua --> do local oldOpen = io.open local access_OK = function(filename, mode) <檢查各類權限,判斷是否合法> end io.open = function(filename,mode) if access_OK(filename, mode) then return oldOpen(filename, mode) else return nil, "access denied" end end end
其中:服務器
<!-- lang: lua --> function(filename,mode)
這個操做是給函數從新定義它的參數:通過從新定義後,一個程序就只能經過新的受限制的版原本調用原來那個未受限制的open函數。示例將原來的不安全的版本保存到closure的一個私有的變量中,從而使得外部再也沒法訪問原來的版本。經過這種技術,能夠在lua的語言層面上就構建一個安全的運行環境,並且不失簡單性、靈活性。函數
再來看一個例子:從新定義sin函數,使其參數可以使用角度來替代弧度,那麼這個新參數必須轉換它的實參,並調用原來的sin函數來完成真正的運算。lua
<!-- lang: lua --> do local oldSin = math.sin local k = math.pi/180 math.sin = function(x) return oldSin(x*k) end end
相對提供一套大而全的解決方案,Lua提供的則是一套"元機制(meta-mechanism)",所以才能夠根據特定的安全須要來建立一個安全運行的環境。code