lua:关于本地范围的模块导入

lua:关于本地范围的模块导入,第1张

概述有两个脚本文件包含以下脚本 //parent.luafunction scope() local var = "abc" require "child"end//child.luaprint(var) 这样,child.lua将打印一个nil值,因为parent.lua中的作用域不会将其本地功能公开给模块.我认为会这样,因为在此范围内和var声明之后声明了require 有两个脚本文件包含以下脚本

//parent.luafunction scope()    local var = "abc"    require "child"end//child.luaprint(var)

这样,child.lua将打印一个nil值,因为parent.lua中的作用域不会将其本地功能公开给模块.我认为会这样,因为在此范围内和var声明之后声明了require指令.我的愿望是将孩子的所有行完全注入父母.只是导出子脚本以提高可读性.我如何通过本地范围? loadfile()不起作用,也没有dofile().函数环境fenv不包含本地值. deBUG.setlocal()似乎无法创建新变量(也需要子进程中的接收器).除了重新编译脚本之外的任何方法?

解决方法 你可以付出一点努力.如果子项中的变量是实数上升值,则可以将它们“链接”到范围函数中的值.如果它们是全局变量(这里似乎就是这种情况),您可以使用setfenv将它们映射到环境,并使用本地变量中的值填充该环境.

下面将按照您的预期打印abc(您可以将loadstring更改为loadfile,效果相同):

function vars(f)  local func = deBUG.getinfo(f,"f").func  local i = 1  local vars = {}  while true do    local name,value = deBUG.getlocal(f,i)    if not name then break end    if string.sub(name,1,1) ~= '(' then vars[name] = value end    i = i + 1  end  i = 1  while func do -- check for func as it may be nil for tail calls    local name,value = deBUG.getupvalue(func,i)    if not name then break end    vars[name] = value    i = i + 1  end  return varsendfunction parent()  local var = "abc"  local child = loadstring("print(var)")  local env = vars(2) -- grab all local/upvalues for the current function  -- use these values to populate new environment; map to _G for everything else  setMetatable(env,{__index = _G})  setfenv(child,env)  child()endparent()

这完全适用于Lua 5.1,但在Lua 5.2中也是如此.

总结

以上是内存溢出为你收集整理的lua:关于本地范围的模块导入全部内容,希望文章能够帮你解决lua:关于本地范围的模块导入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1231461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存