【问题标题】:Function returns nil, but should to return either true or false函数返回 nil,但应该返回 true 或 false
【发布时间】:2016-04-16 16:02:57
【问题描述】:
function table.includeIndex(t,index)
    for k,v in pairs(t) do
        if k == index then
            return true
        end
    end
    return false
end
function table.delete_at(t,index)
    if table.includeIndex(t,index) then
        table.remove(t,index)
    end
end
function table.delete(t,value)
    if table.include(t,value) then
        table.delete_at(t,table.index(t,value))
        return value
    end
end
function table.index(t,item)
    for k,v in pairs(t) do
        if type(t[k]) == 'table' then
            if table.equal(t[k],item) then
                return k
            end
        else
            if t[k] == item then
                return k
            end
        end
    end
    return "none"
end
function table.dup(t)
    local w = {}
    for k,v in pairs(t) do
        w[k] = v
    end
    return w
end
function table.include(t,value)
    for k,v in pairs(t) do
        if t[k] == value then
            return true
        end
    end
        return false
end
function tab(tab)
    return setmetatable(tab,{__index=table})
end
function table.empty(t)
    for k,v in pairs(t) do
        if v ~= nil then
            return false
        end
    end
    return true
end
function table.reject(original,items)
    local t = table.dup(original)
    for k,v in pairs(items) do
        table.delete(t,v)
    end
    return t 
end
---------------------------------------------------
function table.testrejectedArray(t,rejected,index)
    tab(rejected)
    if index == nil then
        index = 1   
    end
    if rejected:empty() then -- The line I'm talking about.
        print('yey')
        return true
    else
        if rejected:include(t[index]) then
            t:testrejectedArray(rejected:reject({t[index]}),index + 1)
        else
            if index < #t + 1 then
                t:testrejectedArray(rejected,index + 1)
            else
                print('haha')
                return false
            end
        end
    end
end
a = tab{1,2,3}
seq = tab{3,1,2}
w = seq:testrejectedArray(a)
print(w)

'---' 之前的所有东西只有在你想运行它时才需要。我应该这样发帖吗?

函数'testrejectedArray'返回nil,但应该返回真/假值。

当我运行代码时,它会打印“yey”, 所以如果块正在运行,但是如果“return true”是下一行,怎么可能不返回一些东西?

关键是如果我们将 'rejected:empty()' 替换为 'true' 那么 函数“testrejectedArray”将返回 true 那么函数返回false? 但是如果我们将 'rejected:empty()' 替换为 'false' 它不打印'yey'

所以 'rejected:empty()' 返回 true,但出于某种原因,它不会返回任何东西。

【问题讨论】:

  • 这不是codereview.stackexchange.com 但你的代码太复杂了。例如,table.includeIndex 可以简单地写为return t[k]~=niltable.emptyreturn next(t)~=nil。在这两种情况下都不需要pairs 循环。
  • "---" 之前的所有代码都是为了让它只能运行。所以不管代码多么混乱,但你的建议有助于改进它,谢谢。

标签: function lua return


【解决方案1】:

由于你是递归调用testrejectedArray,所以每次调用前都需要加上return

    if rejected:include(t[index]) then
        return t:testrejectedArray(rejected:reject({t[index]}),index + 1) --<--
    else
        if index < #t + 1 then
            return t:testrejectedArray(rejected,index + 1) --<--
        else
            print('haha')
            return false
        end
    end

如果您不这样做,则递归调用之一返回的值不会传递给调用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 2020-06-25
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多