2016-01-12 141 views
2
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) 

“---”之前的所有内容仅在需要运行它时才需要。我应该这样发布吗?函数返回nil,但应返回true或false

函数'testrejectedArray'返回零,但应该返回true/false值。

当我运行代码时,它会打印'yey', ,所以如果block正在运行,但如果“return true”是下一行,如何不返回某些内容?

问题是,如果我们用'rejected:empty()'替换为'true',那么 函数'testrejectedArray'将返回true 所以函数返回false? 但是,如果我们用'reject(empty)'替换'false' 它不打印'yey'

所以'rejected:empty()'返回true,但是因为它不会返回我任何东西。

+0

这不是http://codereview.stackexchange.com,但你的代码太复杂了。例如,'table.includeIndex'可以简写为'return t [k]〜= nil'和'table.empty'作为'return next(t)〜= nil'。无论在哪种情况下都不需要“双”环。 – lhf

+0

“---”之前的所有代码在这里只能使其运行。因此,无论代码是多么混乱,但您的建议有助于改善它,所以谢谢。 – Parki

回答

2

既然你叫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 

如果你不这样做,那么由递归调用一个返回的值不会传递到调用函数。