Function Lua函数有多个返回值,Print(returnvalue)导致尝试连接字符串和Nil

Function Lua函数有多个返回值,Print(returnvalue)导致尝试连接字符串和Nil,function,lua,return,null,Function,Lua,Return,Null,以下函数getTank()起作用(例如,如果没有用作打印fluidName的函数)。当我返回值,然后尝试在函数外部访问它们时,就会出现问题。结果是“尝试将字符串和nil连接起来”在以下行中:mon2.write(returnedVariable),例如,它在函数之外 如果我只是做以下几点: for k,v in pairs(tableInfo) do amount=v.amount end print(amount) 在函数之外,它给出了正确的值 function getTank(tank

以下函数
getTank()
起作用(例如,如果没有用作打印
fluidName
的函数)。当我返回值,然后尝试在函数外部访问它们时,就会出现问题。结果是
“尝试将字符串和nil连接起来”
在以下行中:
mon2.write(returnedVariable)
,例如,它在函数之外

如果我只是做以下几点:

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
正如我在上面编辑的代码片段中所指出的,您的局部变量不是您认为的局部变量,并且您没有正确地从函数返回它们的值。将这些变量的本地声明移到for循环之外(如果需要,请将赋值保留在for循环中,尽管我无法想象您会这样做,因为您只能以这种方式获取循环中的最后一个值),并且您的函数应该“工作”。

本地”限定符将范围限制为块或块,因此getTank()中循环中的局部变量的作用域是循环;在循环之外,它们的值丢失。因此,当getTank返回时,它返回的变量没有在函数的作用域中定义,因此它们都是nil。有关有用的示例,请参见


但既然这似乎不能解决您的问题,我打赌您还有一个问题,即
localtableinfo
是空表,这意味着
tankPeriph.getTankInfo(“未知”)
返回空表(不是
nil
,而是
{}

假设pairs(tableInfo)返回的最后一个条目具有您期望的值。请注意,pairs没有定义返回表键/值对的顺序。下面是表本身:{[1]={[“rawName”]=“fluid.honey”、[“amount”]=12150、[“capacity”]=576000、[“name”]=“honey”、[“id”]=52、},}如果该表是tableInfo,那么它应该可以工作(这里可以进行快速模拟测试)。将变量包装在monX.write调用中以调用tostring()(例如
.tostring(fluidName)
)并查看从何处获取nils和值。这样就得到了。非常感谢你。问题是tank0是空的,所以它返回的是nil表示数量。现在唯一的问题是fluidName实际上显示的是储罐内的数量。您两次使用成语
表示k,v成对(t)do。。。结束
,从循环的最后一次迭代中捕获值以供以后使用。由于
pairs()
不能保证表的任何特定遍历顺序(事实上,对于相同的表内容,可以按不同的顺序遍历),因此这可能不是您所认为的那样。
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