2
votes
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)

All thing before '---' needs only if you want to run it. Should I post like that?

The function 'testrejectedArray' return nil, but should to return true/false value.

When I run the code it prints 'yey', so if block is runing, but how is it possible to not return something if "return true" is next line?

The point is that if we substitute 'rejected:empty()' to 'true' then the function 'testrejectedArray' will return true So the function return false? But if we substitute 'rejected:empty()' to 'false' it's don't prints 'yey'

So 'rejected:empty()' return true, but for a reason it won't return me anything.

1
This is not codereview.stackexchange.com but your code is too complicated. For instance, table.includeIndex could be written simply as return t[k]~=nil and table.empty as return next(t)~=nil. No need for the pairs loop in either case. - lhf
All the code before "---" is here to make it runable only. So doesn't matter how messy the code is, but your advice helps to improve it so thanks. - Parki

1 Answers

2
votes

Since you call testrejectedArray recursively, you need to add return before each call:

    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

If you don't do that, then the value returned by one of the recursive calls is not passed up to the calling function.