2014-05-13 70 views
6

有沒有人知道lua 5.2的實際執行情況。 metamethod __pairs?換句話說,如何在metatable中實現__pairs作爲元方法,使其與pairs()完全相同?lua __pairs的實際執行是什麼?

我需要覆蓋__pairs,並且想要跳過一些我在表中添加的虛擬變量。

+0

http:// lua-use rs.org/wiki/GeneralizedPairsAndIpairs – hjpotter92

回答

0

下面的代碼會跳過一些條目。根據需要調整。

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 
+0

'v'應該是本地的。而且,它比默認的「雙」更加不合需要。 – Deduplicator

+0

非常感謝。這更好。 :) – user2872907

3

下面將使用元表元,明確規定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 

對於參考:Lua 5.2 manual, pairs

+1

謝謝!這應該走了! – user2872907