Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在没有索引的情况下遍历变量?_Variables_For Loop_Lua - Fatal编程技术网

Variables 在没有索引的情况下遍历变量?

Variables 在没有索引的情况下遍历变量?,variables,for-loop,lua,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 v

我设置了一些变量,如下所示:

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
local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30
现在我想用这样的循环来迭代它们:

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
local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30
我不能更改变量,也不能创建表。这辆车有可能吗

编辑: 我可以这样做:

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
local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30
但我有大约50辆这样的车。这就是为什么我要寻找一种使用循环的方法

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

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
local varAge = {}
varAge[1] = 10
varAge[2] = 20
varAge[3] = 30
Edit3:
该类将变量保存在如下表中:

您可以通过debug.getlocal迭代所有局部变量,并按名称筛选您感兴趣的变量

下面是如何使用它的示例

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

您真的确定要将语言使用扩展到这一步吗?当您无法使用
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( 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

根据您在评论中提供的示例代码,您应该能够迭代数据结构,而无需使用
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
是一个表还是一个用户数据,只要它提供了一个合适的
\u索引,这都应该有效。当然,您需要某种方法来确定DTClass中的所有元素。只需实现
varcount
函数即可完成此操作


如果
DTClass
是一个表,
varcount
可以像
return#DTClass/var_字段
一样简单,这不是我需要的。我知道变量,但不能更改它们。或者你的问题没有描述你“需要”的内容,或者你只是不知道这个函数允许你完全按照你的要求来做。我没有用var..I..Age尝试过,它不会指向变量,或者会吗?oO如果是,我回答了我自己的问题xDinput:6:尝试连接全局“Age”(一个nil值)不,我没有。@Fox它不是局部变量,它是一个带有自定义字段的局部表。按照预期工作,它是一个单独的用例(比您原来的用例简单得多),我完全知道这一点。但是变量是由一个我无法更改的类设置的,所以我必须像访问它们一样访问它们。@Fox。好啊你真的达到了我在回答中提到的一个高级用途,然后:-)。请考虑在你的问题中添加这个信息(即使用的上下文),这样问题会在下一个读者中显得十分复杂。你能演示一下这个类是如何生成这些变量名的吗?@ GrimWood,如果你是这样的话,我不能给这个类一个表。我只能给出一个字符串,而var就是这样调用的。@Fox不,我的意思是显示一个实际的最小示例,说明如何从类中获取这些变量。把它加到你的问题上。我们也许能想出其他想法。所有这些变量都是局部的?是的。在当前的范围内有一个设置。从未想过这一点,但你是对的!这是解决我问题的最好办法,谢谢^^