循环中的错误

一个正常工作的代码,但它_不像我期望的那样_工作,这很严重,但是这是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。这很烦人)

点赞
用户5675002
用户5675002

当你返回v2 == v比较的结果时,你会退出pairs()循环。值为2从未被触达,你会过早地退出__mod函数,报告了比较1和2的结果。

2020-07-30 10:00:28
用户2858170
用户2858170

在第一个循环运行中,v22v1。因为 2 ~= 1,所以你会返回 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)

可以把这个代码段改写为:

return v2 == v

个人建议不要修改模数运算符用于计算模数以外的东西。如果没有看到实现或注释,我会期望进行一个逐元素的模数计算。为什么不直接编写一个 isInTable(someTable, someNumber) 函数来完成相同功能呢?结果一样而且不会引起混淆。

2020-07-30 10:28:59