具有动态名称的全局变量

简介: 具有动态名称的全局变量

通常,赋值操作对于访问和设置全局变量已经足够了。然而,有时我们也需要某些形式的元编程meta-programming )。例如,我们需要操作一个全局变量,而这个全局变量的名称却存储在另一个变量中或者经由运行时计算得到。为了获取这个变量的值,许多程序员会写出如下的代码:

value = load("return" .. varname)()


例如,如果 varnamex ,那么字符串连接的结果就是 "return x" ,当执行时就能得到期望的结果。然而,在这段代码代码中涉及一个新代码段的创建和编译,在一定程度上开销昂贵。我们可以使用下面的代码来实现相同的效果,但效率却比之前的高出一个数量级:

value = _G[varname]


由于全局环境是一个普通的表,因此可以简单地使用对应的(变量名)直接进行索引。


类似地,我们可以通过编写 _G[varname] = value 给一个名称为动态计算出的全局变量赋值。不过,请注意,有些程序员对于这种机制的使用可能有些过度而写出诸如 _G["a"]=_G["b"] 这样的代码,而这仅仅是 a=b 的一种复杂写法。


上述问题的一般化形式是,允许字段使用诸如 "io.read""a.b.c.d" 这样的动态名称。如果直接使用 _G["io.read"] ,显然是不能从表 io 中得到字段 read 的。但我们可以编写一个函数 getfieldgetfield("io.read") 返回想要的结果。这个函数主要是一个循环,从 _G 开始逐个字段地进行求值:

function getfield(f)
  local v = _G        -- 从全局表开始
  for w in string.gmatch(f, "[%a_][%w_]*") do
    v = v[w]
  end
  return v
end


我们使用函数 gmatch 来遍历f中的所有标识符。


与之对应的设置字段的函数稍显复杂。像 a.b.c.d = v 这样的赋值等价于以下的代码:

local temp = a.b.c
temp.d = v


也就是说,我们必须一直取到最后一个名称,然后再单独处理最后的这个名称。下述代码的函数 setfield 完成了这个需求,并且同时创建了路径中不存在路径对应的中间表:

function setfield (f, v)
  local t = _G                                              -- 从全局表开始
  for w, d in string.gmatch(f, "([%a_][%w_]*)(%.?)") do
    if d == "." then                                        -- 不是最后一个名字?
      t[w] = t[w] or {}                                     -- 如果不存在则创建表
      t = t[w]                                              -- 获取表
    else                                                    -- 最后一个名字
      t[w] = v                                              -- 进行赋值
    end
  end
end


上述代码中使用的模式将捕获字段名称保存在变量 w 中,并将其后可选的点保存在变量 d 中。如果字段名后没有点,那么该字段就是最后一个名称。


下面的代码通过上面代码中的函数创建了全局表 tt.x ,并将 10 赋给了 t.x.y

setfield("t.x.y", 10)
print(t.x.y)                --> 10
print(getfield("t.x.y"))    --> 10
目录
相关文章
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
607 21
|
12天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
970 110
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。