成对循环搞砸了

In pairs loop messed up

一个正常工作的代码,但它 没有像我预期的那样工作,严重的是 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(Exceptions 里面有 2,所以它应该 return 是真的,但是不,它 return 是假的。这很烦人)

当您 return v2 == v 比较的结果时,您就跳出了 pairs() 循环。 从未达到 2 的值,您过早退出 __mod 函数,报告比较 1 和 2 的结果。

在您的第一个循环中,运行 v22v1。作为 2 ~= 1 你 return false 就是这样。没有更多的迭代。在循环后移动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

我个人不鼓励为了计算模数以外的其他事情改变模数运算符。我本来期望在没有看到实现或任何评论的情况下进行逐元素模数计算。为什么不简单地编写一个函数 isInTable(someTable, someNumber) 来做同样的事情呢?同样的结果,没有混淆。