将序列化的数据加载到表中

为了回答另一个问题,我想将一些序列化的 lua 代码加载到表中。要加载的字符串如下:

SavedVars = {  }
SavedStats = {  }

(其中每个 {...} 可以是任何 Lua 表达式,包括具有嵌套数据的表构造函数。我假设它不会调用任何(全局)函数或使用全局变量。)

我最终想要的是这样一个表:

{ ["SavedVar"] = { }, ["SavedStats"] = { } }

我不想在之后拥有全局变量 SavedVars。如何最优雅地实现?

(我已经找到了一个解决方案,但也许有人有更好的方法。)

原文链接 https://stackoverflow.com/questions/5958818

点赞
stackoverflow用户600500
stackoverflow用户600500

以下是我的解决方案:

-- 将字符串加载到一个表中。
--   此函数使用一个新表的环境执行该字符串,然后返回该表。
--
-- 字符串中的代码不应该需要任何它没有声明的变量,
-- 因为这些变量在运行时不可用。 它在一个非常空的环境中运行。
function loadTable(data)
   local table = {}
   local f = assert(loadstring(data))
   setfenv(f, table)
   f()
   return table
end

它使用 loadstring 载入数据字符串,然后使用 setfenv 修改函数的全局环境为一个新表。然后调用载入的函数一次来填充这个表(而不是全局环境),最后将该表返回。

将环境设置为一个新表的效果是,代码无法使用任何全局数据。我认为这是一种很好的隔离代码的方式,但如果不想要这种隔离,你可以在返回表之前填充该表或提供一些元表(但在返回表之前取消设置)。

这个载入函数也适用于像使用循环保存表中生成的序列化数据。

2011-05-11 03:23:01