簡體   English   中英

Lua函數多個返回值,Print(returnvalue)導致嘗試連接字符串和Nil

[英]Lua Function Multiple Return Values, Print(returnvalue) Results in Attempt to Concatenate String and Nil

以下函數getTank()起作用(例如,如果不用作打印fluidName的函數)。 當我返回值然后嘗試在函數外部訪問它們時,問題就來了。 結果是'attempt to concatenate string and 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
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循環中,盡管我真的無法想象您會這樣做,因為這樣只會得到循環中的最后一個值)功能應該“起作用”。

“ local”限定詞將范圍限制為塊或塊,因此getTank()中循環中的局部變量作用域為循環; 在循環外,其值將丟失。 因此,當getTank返回時,它返回的變量尚未在函數范圍內定義,因此它們均為nil。 有關有用的示例,請參見http://www.lua.org/manual/5.1/manual.html#2.6

但是由於這似乎無法解決您的問題,因此我認為您還有一個問題,即local tableInfo是空表,這意味着tankPeriph.getTankInfo("unknown")返回空表(不是nil ,而是{} )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM