不使用索引遍历变量?

我设置了一些变量,像这样:

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个这样的变量。这就是为什么我要搜索一种用循环来完成的方法。

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

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

编辑3: 该类将变量保存在如下表格中:http://ideone.com/iO4I8N

点赞
用户744720
用户744720

您可以通过 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-28 11:26:05
用户2633423
用户2633423

你真的确定你要这么极端地拉伸语言用法吗?使用 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(n2)行为,只需扫描一次本地变量并将它们的值存储在表中:

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

local function GetLocalVars(级别)
    local result = {}
    for i = 1,math.huge do
        local name,value = debug.getlocal(level,i)
        如果没有名称则打破end
        result [ name ] = value
    end
    返回结果
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-28 12:19:06
用户234175
用户234175

根据你在这里的评论中提供的样本代码,您应该能够在不需要使用 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是表格或用户数据的情况。当然,您需要一些方法来确定DTClass中元素的总数。只需实现varcount函数即可。

如果DTClass是表格,则varcount可以简单地为return #DTClass / var_fields

2013-10-29 01:06:39