将老版本的函数保存在一个私有的变量中,只用新版本的函数才能访问它,这样的技术创建一个安全的运行环境,即所谓的“沙盒(sandbox)”。当执行一些未受信任的代码时就需要一个安全的运行环境,例如在服务器中执行那些从internet上接收的代码。下面是个例子:如果要限制一个程序访问文件的话,只需要使用closure(闭合函数)来重定义函数的io.open:
dolocal 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 endend 检查各种权限,判断是否合法>
其中:
function(filename,mode)
这个操作是给函数重新定义它的参数:经过重新定义后,一个程序就只能通过新的受限制的版本来调用原来那个未受限制的open函数。示例将原来的不安全的版本保存到closure的一个私有的变量中,从而使得外部再也无法访问原来的版本。通过这种技术,可以在lua的语言层面上就构建一个安全的运行环境,而且不失简单性、灵活性。
再来看一个例子:重新定义sin函数,使其参数能够使用角度来替代弧度,那么这个新参数必须转换它的实参,并调用原来的sin函数来完成真正的运算。
dolocal oldSin = math.sin local k = math.pi/180 math.sin = function(x) return oldSin(x*k) endend
相对提供一套大而全的解决方案,Lua提供的则是一套"元机制(meta-mechanism)",因此才可以根据特定的安全需要来创建一个安全运行的环境。