【问题标题】:How to run a function without using any functions defined in the script in Lua如何在不使用 Lua 脚本中定义的任何函数的情况下运行函数
【发布时间】:2020-12-11 14:47:18
【问题描述】:

我正在尝试加载字符串并将其作为函数运行。这是我的问题:

a = "hello"
loadstring("print(a)")()

我不希望上面的代码使用它之外的任何变量/函数。我的目标是让上面的脚本打印 nil,因为在加载字符串中没有定义。

抱歉,问题很简短。很难解释我的问题。

【问题讨论】:

  • @Joseph Sible-Reinstate Monica 对不起我的错。我的意思是要有一个全局变量而不是本地变量。

标签: lua


【解决方案1】:

您的变量a 存在于全局环境中。为了不让你的块看到它,你需要给它一个不同的环境。在 Lua 5.1 中,你会这样做:

a = "hello"
local chunk = loadstring("print(a)")
setfenv(chunk, {print = print})
chunk()

在 Lua 5.2 或更高版本中,您可以这样做:

a = "hello"
load("print(a)", nil, "t", {print = print})()

请务必注意,print 并不神奇。它不会出现在新环境中,除非你像我一样明确地把它放在那里。

【讨论】:

  • 非常感谢!我还是有问题。如果这个字符串是动态的怎么办。我不知道要执行什么。我是否必须定义每个 LuaU (Roblox Lua) 函数?
  • @Cottient 你可以做一些技巧,比如深拷贝_G,然后删除你不想要的东西,但这真的开始听起来像XY problem。您实际上想通过限制这样的脚本来实现什么?你能像你第一次发布问题时那样改用locals 吗?
  • 我想要实现的是类似于脚本编辑器的东西。用户键入代码并按下执行。把它想象成一个命令行。如果没有其他解决方案,那么我想我会将所有内容都本地化。
  • @Cottient 在这种情况下,这绝对是你应该做的。编写 Lua 时的一个好习惯是一切都应该始终是本地的,除非你有充分的理由不这样做。在这种情况下你没有,事实上你有充分的理由这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多