我设置了一些像这样的变种:
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
答案 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
一样简单。