5

我设置了一些这样的变量:

local var1Age = 10
local var2Age = 20
local var3Age = 30

现在我想用这样的循环迭代它们:

for i=1, 3 do
    if var..i..Age >= 21 then
        print("yep")
    end
end

我无法更改变量,也无法创建表。这个变量有可能以某种方式出现吗?

编辑: 我可以做这样的事情:

if var1Age >= 21 then
    print("yep")
end
if var2Age >= 21 then
    print("yep")
end
if var3Age >= 21 then
    print("yep")
end

但我有大约 50 个这样的变量。这就是为什么我寻找一种使用循环的方法。

Edit2: 变量是由我无法更改的类设置的,因此我无法更改设置变量的方式。例如,我不能像这样设置变量:

local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30

Edit3: 该类将变量保存在这样的表中:http: //ideone.com/iO4I8N

4

3 回答 3

5

您可以通过名称遍历所有局部变量debug.getlocal并过滤您感兴趣的变量。http://www.lua.org/pil/23.1.1.html

这是有关如何使用它的示例。

local var1Age = 10
local var2Age = 20
local var3Age = 30

function local_var_value(n)
    local a = 1
    while true do
        local name, value = debug.getlocal(2, a)
        if not name then break end
        if name == n then
            return value
        end
        a = a + 1
    end
end

for i=1, 3 do
    local v = local_var_value("var"..i.."Age")
    if v and v >= 21 then
        print("yep")
    end
end
于 2013-10-28T11:26:05.537 回答
4

您真的确定要将语言使用扩展到这么远吗?当您不能这样做时,应将库的使用debug留作高级使用。

也许您的编程问题可以使用“常规” Lua 工具以更优雅的方式解决。要使变量序列由数字索引,只需将表用作数组:

local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30

for i=1,#varAge do
    if varAge[i] >= 21 then
        print("yep")
    end
end

编辑

如果你真的需要使用debug.getlocal并且性能确实是一个问题,你可以避免潜在的 O(n 2 ) 行为只扫描一次本地并将它们的值存储在一个表中:

local var1Age = 10
local var2Age = 20
local var3Age = 30

local function GetLocalVars( level )
    local result = {}
    for i = 1, math.huge do
        local name, value = debug.getlocal( level, i )
        if not name then break end
        result[ name ] = value
    end
    return result
end

local local_vars = GetLocalVars( 2 )

for i = 1, 3 do
    local name = "var"..i.."Age"
    local v = local_vars[ name ]
    if v and v >= 21 then
        print("yep")
    end
end
于 2013-10-28T12:19:06.100 回答
2

根据您在此处的评论中提供的示例代码,您应该能够遍历您的数据结构而无需使用debug.getlocal

local vars = varcount(DTClass)

for i = 1, vars do
  local vari = "var" .. i
  local variAge = DTClass[vari.."Age"]
  if variAge and variAge >= 21 then
    print(DTClass[vari.."Weight"])
  end
end

假设它DTClass提供合适的__index. 当然,您需要一些方法来确定 DTClass 中的总元素。只需实现该varcount功能即可。

如果DTClass是一个表,varcount可以像return #DTClass / var_fields.

于 2013-10-29T01:06:39.573 回答