博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展 lua require 的行为
阅读量:5066 次
发布时间:2019-06-12

本文共 1529 字,大约阅读时间需要 5 分钟。

扩展 lua require 的行为

 

来源 https://blog.codingnow.com/2015/10/lua_require_env.html

 

今天同事提了个需求,他希望可以给部分 lua 代码(由策划编写)做一个沙盒关起来。在 lua 里做沙盒很容易,只需要控制函数的环境就可以了。不过另一个附加需求是,这些代码还可以直接利用 require 加载。

而我们又不想去修改系统的 api 接口,那么怎么做到这点呢?

首先, 我希望使用的时候看起来像这样:

local xxx = require "xxx" (myEnv)

和传统的 require 用法不同,可以在后面追加一个参数 myEnv 。这样的话,每次 xxx 模块被 require 时,它其实被重复运行一次,但会绑定不同的 _ENV 。

其次,既然模块会被反复初始化,那么我们甚至还可以约定,每个这种沙盒封装的模块还可以接收 require 的传入的额外参数。

做到这点很容易,我们只需要在 package.searchers 里追加一个自定义的 loader 然后并不返回加载的模块 chunk ,而是做一个函数封装。将 chunk 的运行推迟到传入 myEnv 调用之后。

这样,load chunk 本身还是依靠 require 的 package 机制缓存代码的,只是每次调用后,重新绑定 _ENV 生成了一组新实例。

我在 gist 上贴了一组代码实现这个特性: 。

 

local M = {}function M.test(...)    print(...)endreturn M

 

 

local package = packagelocal debug = debuglocal function load_env(filename)    local f,err = loadfile(filename)    if f == nil then        return err    end    return function()        return function(env)            if env then                debug.setupvalue(f, 1, env)            end            return f(filename)        end    endendlocal function searcher_env(name)    local filename, err = package.searchpath(name, package.upath)    if filename == nil then        return err    else        return load_env(filename)    endendtable.insert(package.searchers, searcher_env)

 

require "requirenv"package.upath = "./?.user.lua"local myprint = printlocal env = {    print = function (...)        myprint("hook", ...)    end}local s = require "mymod"(env)s.test "hello world"  -- hook hello world

 

转载于:https://www.cnblogs.com/lsgxeva/p/7761000.html

你可能感兴趣的文章
POJ2288 Islands and Bridges(TSP:状压DP)
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
IOS开发UI篇--UITableView的自定义布局==xib布局
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法
查看>>
QML学习笔记之一
查看>>
7NiuYun云存储UploadPicture
查看>>
Window 的引导过程
查看>>
python与 Ajax跨域请求
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
贪吃蛇游戏改进
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
在WPF中使用Caliburn.Micro搭建MEF插件化开发框架
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
asp.net core系列 35 EF保存数据(2) -- EF系列结束
查看>>
WPF程序加入3D模型
查看>>