日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扩展 lua require 的行为

發布時間:2024/4/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扩展 lua require 的行为 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

擴展 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 上貼了一組代碼實現這個特性:延遲綁定環境的 require?。

?

mymod.user.lua

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

?

?

requirenv.lua

local package = package local debug = debuglocal function load_env(filename)local f,err = loadfile(filename)if f == nil thenreturn errendreturn function()return function(env)if env thendebug.setupvalue(f, 1, env)endreturn f(filename)endend endlocal function searcher_env(name)local filename, err = package.searchpath(name, package.upath)if filename == nil thenreturn errelsereturn load_env(filename)end endtable.insert(package.searchers, searcher_env)

?

test.lua

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

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的扩展 lua require 的行为的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。