2013-11-15 51 views
1

以下函数getTank()适用(如果未用作打印fluidName的函数)。当我返回值然后尝试在函数之外访问它们时,问题就出现了。例如,结果为'attempt to concatenate string and nil',其线路为:mon2.write(returnedVariable),例如在该功能之外。Lua函数多个返回值,打印(返回值)尝试连接字符串的结果和零

如果我只是做到以下几点:

for k,v in pairs(tableInfo) do amount=v.amount end 
print(amount) 

之外的功能,它提供了正确的值。

function getTank(tankPeriph) 
    -- This has been tested and works 

    local tableInfo = tankPeriph.getTankInfo("unknown") 
    local fluidRaw, fluidName, fluidAmount, fluidCapacity 

    for k,v in pairs(tableInfo) do 
     fluidRaw = v.rawName 
     fluidName = v.name 
     fluidAmount = v.amount 
     fluidCapacity = v.capacity 
    end 
    return fluidRaw, fluidName, fluidAmount, fluidCapacity 
end 

function dispTanks() 
    -- working on it 

    -- TANK 0 
    mon2.setCursorPos(rowPos, ironTank0Col) 
    mon2.clearLine() 
    local fluidRaw, fluidName, fluidAmount, fluidCapacity = getTank(irontank0) 
    mon2.write("Iron Tank 0 (" .. fluidName .. ") : " .. fluidAmount) 

    -- TANK 1 
    mon2.setCursorPos(rowPos, ironTank1Col) 
    mon2.clearLine() 
    local fluidRaw, fluidName, fluidAmount, fluidCapacity = getTank(irontank1) 
    mon2.write("Iron Tank 1 (" .. fluidName .. ") : " .. fluidAmount) 

    -- TANK 2 
    mon2.setCursorPos(rowPos, ironTank2Col) 
    mon2.clearLine() 
    local fluidRaw, fluidName, fluidAmount, fluidCapacity = getTank(irontank2) 
    mon2.write("Iron Tank 2 (" .. fluidName .. ") : " .. fluidAmount) 

    -- TANK 3 
    mon2.setCursorPos(rowPos, ironTank3Col) 
    mon2.clearLine() 
    local fluidRaw, fluidName, fluidAmount, fluidCapacity = getTank(irontank3) 
    mon2.write("Iron Tank 3 (" .. fluidName .. ") : " .. fluidAmount) 

    -- TANK 4 
    mon2.setCursorPos(rowPos, ironTank4Col) 
    mon2.clearLine() 
    local fluidRaw, fluidName, fluidAmount, fluidCapacity = getTank(irontank4) 
    mon2.write("Iron Tank 4 (" .. fluidName .. ") : " .. fluidAmount) 

end 
+0

你用两个成语'for k,v in pairs(t)do ... end'来捕获最后一次循环迭代的值,以便以后使用。由于'pairs()'不能保证任何特定的表遍历顺序(事实上,对于相同的表内容,可能会有不同的顺序),所以这可能不会做你认为它正在做的事。 – RBerteig

回答

1
function getTank(tankPeriph) 
    -- This has been tested and works 

    local tableInfo = tankPeriph.getTankInfo("unknown") -- Local to the getTank function. 

    for k,v in pairs(tableInfo) do 
     local fluidRaw = v.rawName -- local to this for loop 
     local fluidName = v.name -- local to this for loop 
     local fluidAmount = v.amount -- local to this for loop 
     local fluidCapacity = v.capacity -- local to this for loop 
    end 

    return fluidRaw, fluidName, fluidAmount, fluidCapacity -- Returning the values of global variables (which are nil). 
end 

正如我在编辑的片段显示你上面的当地人不是本地的,你认为他们是和你是不是从你的函数返回正确的值。将这些变量的局部声明移到for循环之外(如果需要,可以在for循环中保留赋值,尽管我不能真正想象你会这样做,因为你只能以循环的方式获取最后一个值)和你的功能应该“工作”。

+0

编辑代码。看看我所做的是你的意思。 –

+0

这应该工作,是的。 –

+0

不知道为什么,但错误仍然相同。 –

1

“本地”限定符将范围限制为块或块,因此getTank()中循环中的局部变量被限定在循环中;在循环之外他们的价值被丢失。所以当getTank返回时,它返回的变量没有在函数的范围中定义,所以它们都是零。有用的例子见http://www.lua.org/manual/5.1/manual.html#2.6

但因为似乎没有解决您的问题,我打赌你有另外一个问题,即local tableInfo为空表,这意味着tankPeriph.getTankInfo("unknown")返回空表(未nil,但{})。