gpt4 book ai didi

lua - Lua中是否有可以用来访问局部变量的表?

转载 作者:行者123 更新时间:2023-12-04 14:36:59 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Access local variable by name

(2 个回答)


4年前关闭。




就像我们如何做到这一点:

a = 3
print(_G['a']) -- 3

我希望能够做这样的事情:
local a = 3
print(_L['a']) -- 3

我基本上希望能够使用它们的名称作为字符串来访问局部变量。是否有可以执行此操作的表,也许可以作为函数参数传递的表?就像 this ActionScript 中的关键字。

最佳答案

这可以通过 debug 实现图书馆 - 即 getlocal setlocal 职能。如果你不能使用这个库(或访问 C API ),那么你就不走运了。

您可以使用特制的 _L 扩展您的全局环境。表,当访问时执行当前局部变量集的线性查找。

读取局部变量只是找到一个匹配的变量名,并返回它的值。写入局部变量需要您在堆栈帧中发现它的索引,然后相应地更新值。请注意,您不能创建新的本地人。

这是一个适用于 Lua 5.1(但不适用于 Lua 5.2+)的简单示例。

local function find_local (key)
local n = 1
local name, sname, sn, value

repeat
name, value = debug.getlocal(3, n)

if name == key then
sname = name
sn = n
end

n = n + 1
until not name

return sname, sn
end

_G._L = setmetatable({}, {
metatable = false,
__newindex = function (self, key, value)
local _, index = find_local(key)

if not index then
error(('local %q does not exist.'):format(key))
end

debug.setlocal(2, index, value)
end,
__index = function (_, key)
return find_local(key)
end
})

正在使用:
local foo = 'bar'

print(_L['foo']) --> 'bar'
_L['foo'] = 'qux'
print(_L['foo']) --> 'qux'

local function alter_inside (key)
local a, b, c = 5, 6, 7
_L[key] = 11
print(a, b, c)
end

alter_inside('a') --> 11 6 7
alter_inside('b') --> 5 11 7
alter_inside('c') --> 5 6 11

您可以以不同的方式编写它,使用普通函数而不是结合读/写操作的表( __index__newindex )。

§2.4 – Metatables and Metamethods 如果以上元表的使用对你来说是一个全新的话题。

在 Lua 5.2+ 中,你可以使用特殊的 _ENV 表来调整当前块的环境,但请注意,这与使用 local 不同。变量。
local function clone (t)
local o = {}

for k, v in pairs(t) do o[k] = v end

return o
end

local function alter_inside (key)
local _ENV = clone(_ENV)

a = 5
b = 6
c = 7

_ENV[key] = 11

print(a, b, c)
end

alter_inside('a') --> 11 6 7
alter_inside('b') --> 5 11 7
alter_inside('c') --> 5 6 11

最后要注意的是,还要考虑这种(ab)使用本地人的方法可能不是最好的方法。

您可以在适当的时候简单地将变量存储在表中,从而以更少的开销获得相同的结果。强烈推荐这种方法。
local function alter_inside (key)
-- `ls` is an arbitrary name, always use smart variable names.
local ls = { a = 5, b = 6, c = 7 }

ls[key] = 11

print(ls.a, ls.b, ls.c)
end

alter_inside('a') --> 11 6 7
alter_inside('b') --> 5 11 7
alter_inside('c') --> 5 6 11

不要试图解决不必要的问题,让自己陷入困境。

关于lua - Lua中是否有可以用来访问局部变量的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40838093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com