For loop 两人一组的循环搞砸了

For loop 两人一组的循环搞砸了,for-loop,lua,lua-table,For Loop,Lua,Lua Table,一个正常工作的代码,但它并没有像我预期的那样工作,认真地说,但有Lua local Exceptions = {1,2,3,5,7} local mt = {__mod = function(v1, v2) for i, v in pairs (v1) do if v2 == v then return true else return false end end end } setmetatable(Exceptions, mt

一个正常工作的代码,但它并没有像我预期的那样工作,认真地说,但有Lua

local Exceptions = {1,2,3,5,7}
local mt = {__mod = function(v1, v2)
  for i, v in pairs (v1) do 
    if v2 == v then 
      return true
    else
      return false 
    end 
  end 
end }
setmetatable(Exceptions, mt)
print(Exceptions % 2)

v2==v内部异常有2个,所以它应该返回true,但不,它返回false。这很烦人

当您返回v2==v比较结果时,您会中断pairs循环。 如果从未达到2的值,则过早退出_mod函数,报告比较1和2的结果。

在第一次循环运行中,v2为2,v为1。当2~=1时,返回false,就是这样。没有更多的迭代。循环结束后,Move return false

local Exceptions = {1,2,3,5,7}
local mt = {__mod = function(v1, v2)
  for i, v in pairs (v1) do 
    if v2 == v then 
      return true
    end 
  end
  return false  
end }
setmetatable(Exceptions, mt)
print(Exceptions % 2)
而不是

if v2 == v then 
  return true
else
  return false 
end
你可以简单地写

return v2 == v

我个人不鼓励为计算模数以外的其他事情修改模数运算符。我原本希望在没有看到实现或任何评论的情况下进行元素级模数计算。为什么不简单地写一个函数isInTablesomeTable,一个做同样事情的数字呢?相同的结果,没有混淆。

我在处理元表和元方法时遇到了这个错误。谢谢你回答我。返回v2==v将不起作用,它将返回false而不是true@BlaztOne我不明白你的意思。我刚刚告诉过你,你可以减少你的代码4行。当您的代码为2==1返回false时,我的较短版本当然也会返回false。您的问题的解决方案写在上面的部分中。return v2==v不是用来解决您的问题的。它不能在循环中这样做,因为它也会过早地结束循环。这只是一些额外的建议