Lua __pairs 的实际实现是什么?

7

有没有人知道lua 5.2中元方法__pairs的实际实现?换句话说,我应该如何在metatable中将__pairs实现为元方法,以便其与pairs()完全相同?

我需要重写__pairs并希望跳过我在表中添加的一些虚拟变量。


http://lua-users.org/wiki/GeneralizedPairsAndIpairs - hjpotter92
2个回答

4
以下示例将使用元表meta来显式提供pairs的默认行为:

pairs

function meta.__pairs(t)
  return next, t, nil
end

现在,为了跳过特定元素,我们必须替换返回的next指针:
function meta.__pairs(t)
  return function(t, k)
    local v
    repeat
      k, v = next(t, k)
    until k == nil or theseok(t, k, v)
    return k, v
  end, t, nil
end

For reference: Lua 5.2 manual, pairs


1
谢谢!这应该可以运行! - user2872907

1
下面的代码跳过了一些条目。根据需要进行调整。
local m={
January=31, February=28, March=31, April=30, May=31, June=30,
July=31, August=31, September=30, October=31, November=30, December=31,
}

setmetatable(m,{__pairs=
function (t)
    local k=nil
    return
    function ()
        local v
        repeat k,v=next(t,k) until v==31 or k==nil
        return k,v
    end
end})

for k,v in pairs(m) do print(k,v) end 

v 应该是一个本地变量。此外,它与默认的 pairs 相比分歧更大,这并不是必要的。 - Deduplicator
非常感谢。这甚至更好。 :) - user2872907

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接