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

2024-03-07

有两个脚本文件,脚本如下

//parent.lua
function scope()
    local var = "abc"

    require "child"
end

//child.lua
print(var)

这样,child.lua 将打印 nil 值,因为 Parent.lua 中的范围不会向模块公开其本地功能。我认为会的,因为 require 指令是在这个范围内并且在 var 声明之后声明的。我的愿望是将子代的所有行几乎完全注入到父代中。子脚本只是为了更好的可读性而导出。我怎样才能传递本地范围? loadfile() 不起作用,dofile() 也不起作用。函数环境 fenv 不包含本地值。 debug.setlocal() 似乎无法创建新变量(它还需要子级中的接收器)。除了重新编译脚本还有什么方法吗?


只要稍加努力就可以。如果你的变量在child是真正的高价值,你可以将它们“链接”到你的价值scope功能。如果它们是全局变量(这里似乎是这种情况),您可以使用将它们映射到环境setfenv并使用本地变量中的值填充该环境。

将打印以下内容abc正如你所期望的(你可以改变loadstring to 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 vars
end

function 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()
end

parent()

这都是针对 Lua 5.1 的,但在 Lua 5.2 中也是可能的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 无法从本地文件夹运行 Jquery

    你好 我是网络开发新手 我需要与JQuery 即使我已经成功尝试过一个jquery但仅在将文件复制到我的在线 ftp 文件夹后 我完全无法从本地文件夹运行它 请解释一下 如何我可以测试一些新脚本吗 进行额外的练习将文件复制到 ftp 文件夹
  • Swift 中的条件导入

    我有一个在各种应用程序中使用的日志功能 由于我在整个应用程序中使用它 因此也可以方便地进行 Crashlytics 日志记录调用 然而 并非每个应用程序都使用 Crashlytics 在 Objective C 中 您可以使用预处理器条件来
  • iPhone Objective-C 以编程方式将范围按钮添加到 UISearchBar

    我目前这段代码用于创建 UISearchBar 改编自之前的 stackoverflow 示例 UISearchBar searchBar UISearchBar alloc initWithFrame CGRectZero searchB
  • 适用于 IEEE 802.15.4 的 Wireshark Lua 解析器 - DissectorTable 名称?

    我正在lua中开发wireshark解析器来解析基于802 15 4的自定义协议 不幸的是我无法找出正确的 DissectorTable 名称 table DissectorTable get wpan wpan does not work
  • 乔达时间:将 UTC 转换为本地时间

    我想将 Joda Time UTC DateTime 对象转换为本地时间 这是一种看似有效的费力方法 但一定有更好的方法 这是没有周围声明的代码 在 Scala 中 val dtUTC new DateTime 2010 10 28T04
  • 有没有对数字(千)进行分组的函数?

    小 模块中是否隐藏着一个函数 它为我执行此操作 my var 23654325432 var reverse var var s d 3 K d g var reverse var I like 数字 格式 http search cpan
  • 在 Lua/LuaFileSystem 中创建一个新文件

    我已经查看了 Lua 和 LuaFileSystem 文档 但尚未找到创建新文件的方法 我也在这里四处寻找 但目的相同 请注意 我正在寻找的解决方案必须与操作系统无关 以确保可移植性 但我很高兴针对不同的系统获得不同的答案 示例 将 Hel
  • Linq 是如何工作的(在幕后)?

    我正在考虑为 Lua 制作类似 Linq 的东西 并且我大致了解 Linq 的工作原理 但想知道是否有一篇好文章 或者是否有人可以解释 C 如何使 Linq 成为可能 注意 我的意思是在幕后 比如它如何生成代码绑定等等 而不是最终用户语法
  • 通过命令行参数选择要使用的 ocaml 模块

    在我的代码中我有module M Implementation1然后我参考M 代替Implementation1 问题是 我必须重新编译我的程序才能改变Implementation1 to Implementation2 我想通过命令行参数
  • 为所有用户持久安装 PowerShell 模块

    我正在通过以下方式安装 PowerShell 模块八达通部署 http octopusdeploy com 到许多不同的服务器上 出于测试目的 我按照 Microsoft 文档的指导进行了安装PowerShell模块 https learn
  • 如何在网页中显示嵌入的 Excel 文件?

    我想允许在网页中查看嵌入的 Excel 报告 有什么办法吗 我不想使用 ActiveX 或 OWC Office Web 组件 我只想从 Internet Explorer 应用程序打开现有文件 我不希望用户下载然后打开它 使用 ifram
  • JavaScript 中提升名称解析顺序如何工作?

    我遇到一个有趣的quiz http davidshariff com js quiz q 5 function bar return foo foo 10 function foo var foo 11 alert typeof bar 我
  • (在 Ruby 中)允许混合类方法访问类常量

    我有一个为其定义常量的类 然后我定义了一个类方法来访问该类常量 这很好用 一个例子 usr bin env ruby class NonInstantiableClass Const hello world class lt lt self
  • luajit2.0.0 -- 分段错误:11

    我使用一个简单的例子http lua users org wiki SimpleLuaApiExample http lua users org wiki SimpleLuaApiExample进行测试 该示例可以成功静态链接libluaj
  • Angular UI 模式的范围问题

    我无法理解 使用角度 UI 模式的范围 虽然这里不是很明显 但我已经正确设置了模块和所有内容 据我所知 但这些代码示例尤其是我发现错误的地方 index html 其中重要部分 div class btn group div
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • PowerShell 中的变量作用域

    PowerShell 的一个遗憾是函数和脚本块是动态作用域的 但另一件事让我感到惊讶的是 变量在内部作用域内表现为写时复制 array g function foo array h Write Host array array s Writ
  • python导入模块时如何避免一直写模块名?

    我用math最近模块很多 我不想写math sqrt x and math sin x 每时每刻 我想缩短它并写sqrt x and sin x How 对于较长的模块名称 通常会缩短它们 例如 import numpy as np 然后您
  • 包括文件、覆盖变量

    我试图通过在代码末尾要求第二个来覆盖第一个 lua 文件中的变量 文件1 lua val 1 require file2 文件2 lua val 2 不幸的是 这似乎不起作用 因为此后 val 仍然是 1 我想出的解决方案是一个新函数 允许
  • 括号内声明的对象的范围

    如果我声明一个这样的对象 void main myclass objectA anotherclass true true 0 即 我通过直接调用后者的构造函数来创建一个 objectA 和另一个对象 anotherclass anothe

随机推荐

  • 使用“is”来命名布尔变量是不好的做法吗?

    现在命名以 is 开头的布尔值是不好的做法吗 我的经理认为 isAnything 已经过时且糟糕的做法 这是真的 myManager isLame correct incorrect 它在很多语言中都经常使用 但我不知道是否可以肯定地说它是
  • 团队中审批应用程序的 API - 是否有任何其他 API 可用于团队中新的审批应用程序?

    是否有任何 REST API 可用于团队中的新审批应用程序 在 Microsoft Teams 中发送 接收 管理和共享批准 您创建 管理和共享的所有系统的审批中心 能够在 Microsoft Teams 中直接查看并采取行动 快速完成工作
  • Python Matplotlib 动画帧重叠

    I am working on my orbit program and I have currently only animated the moon with a downward y velocity of 1023 The anim
  • 实体框架 - 对象上下文的关闭

    在使用 EFProfiler 顺便说一句 绝对是很棒的工具 对我们的一些实体框架应用程序进行分析后 似乎在大多数情况下 所有对象上下文都没有关闭 例如 在本地运行后 EF Profiler 告诉我有326对象上下文已打开 但只有 1 个被关
  • Keras 自定义损失函数不打印张量值

    我正在编写一个简单的损失函数 其中我必须将张量转换为 numpy 数组 这是必需的 我只是想打印张量的值 但收到此错误 张量 loss activation 4 loss Print 0 shape 224 224 2 数据类型 float
  • 如何通过 Mercurial 命令行获取所有关闭的分支?

    在命令行中 我可以通过以下方式获取没有闭合分支的所有头 hg heads 我还可以通过以下方式获取所有具有闭合分支的头 hg heads closed 但是 我如何通过命令行知道所有关闭的分支 RTM hg help revsets hg
  • Node.js:客户端模板与服务器端模板

    我已经尝试学习 Node js 几天了 但有一件事情我很困惑 JQuery 模板等客户端模板解决方案与 Jade for Node js 等服务器端解决方案之间有什么区别 各有什么用途 它们用在哪里 它们可以一起使用吗 如果有的话 有没有两
  • 使用“IN”命令将数组作为参数传递给 SQL 查询

    大家下午好 我有一个关于 SQL 查询的问题 是否可以使用数组作为使用 IN 命令的查询的参数 例如 int x 2 3 4 5 UPDATE table name set field 数据 WHERE field ID IN x 我问这个
  • Auth.net 捕获问题

    我在 auth net 上捕获交易的函数是 public function capture Varien Object payment amount if this gt isEnabled return parent capture pa
  • 带地址的 R 地理编码

    我有 32K 行地址 我必须为其查找长 纬度值 我正在使用找到的代码here http www storybench org geocode csv addresses r 我非常感谢这个人创造了它 但我有一个问题 我想对其进行编辑 以便如
  • pthread_create 的钩子

    是否有 在 glibc 2 5 及更新版本中 为 pthread create 定义钩子的方法 有很多二进制应用程序 我想编写一个动态库通过 LD PRELOAD 加载 我可以在 main 属性构造函数 的入口处添加钩子 但是如何强制我的代
  • 如何在Stream上短路reduce?

    假设我有一个布尔值流 并且我正在编写的归约操作是 或者 我能否以一种方式编写它 以便在以下情况下放弃至少某些元素的评估 true遇到的值是 我正在寻找一定程度的优化 也许如果它是并行流 不一定是完全优化 尽管后者会很棒 我怀疑你想要这种类型
  • 如何使新的 html 5 datalist 输入立即打开?

    问题很难理解 英语不是我的母语 我会尽力而为 所以新的html标签
  • 在 SDL Tridion 2011 发布期间提出“警告”状态

    我们希望实现一些功能 以便当由于某种原因在发布或解决过程中发生错误时 我们可以使用 try catch 块跳过它 但仍然希望通知用户某些内容被跳过 SDL Tridion 2011 发布队列可以按状态进行过滤 这些状态之一是 警告 是否可以
  • npmauditfix --force 改变了什么以及如何修复它?

    我试图npm install apn save并使用npm audit fix force 希望你知道自己在做什么 的信息让我意识到我不知道自己在做什么 之后我原本得到 node home ec2 user myapp bin www sy
  • P4 - 为客户更改工作空间

    我想使用 p4 命令行更改工作区客户端 但我不知道是否可能 您可以使用 p4workspace 命令创建 删除或编辑工作区 但我想使用 bat 方法更改当前工作区 示例 p4 c MyClient 更改工作空间 myNewWorkspace
  • Ubuntu 14.04:升级到 php7 并卸载 php5?

    我正在将基于 Ubuntu 14 04 的 docker 映像中的 php 版本升级到 7 0 我读了一些文章 给出了在安装 php7 0 时卸载 php5 的命令 这真的有必要吗 优缺点都有什么 添加 PHP 7 的新存储库 apt ge
  • 在 Django 中,如何在组添加或删除用户时获取信号?

    在 Django 管理中 我有时会向 现有 组添加或删除用户 当发生这种情况时 我希望能够运行一个函数 我只是使用标准的用户和组模型 我已经考虑过通过 m2m changed 使用信号来完成此操作 但似乎需要一个 Through 类 我认为
  • gdfs 到图表,反之亦然

    当我使用python的时候会发生以下情况osmnx如下 graph osmnx graph from polygon Data bbox gdf nodes gdf edges osmnx save load graph to gdfs g
  • lua:关于本地范围的模块导入

    有两个脚本文件 脚本如下 parent lua function scope local var abc require child end child lua print var 这样 child lua 将打印 nil 值 因为 Par