通过没有索引的变量进行迭代?

时间:2013-10-28 11:15:18

标签: variables for-loop lua

我设置了一些像这样的变种:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:2)

根据您在评论here中提供的示例代码,您应该能够遍历数据结构,而无需使用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一样简单。