какова фактическая реализация lua __pairs?

Кто-нибудь знает фактическую реализацию lua 5.2. метаметод __pairs? Другими словами, как мне реализовать __pairs как метаметод в метатаблице, чтобы он работал точно так же с pairs()?

Мне нужно переопределить __pairs и пропустить некоторые фиктивные переменные, которые я добавляю в таблицу.


person user2872907    schedule 13.05.2014    source источник
comment
lua-users.org/wiki/GeneralizedPairsAndIpairs   -  person hjpotter92    schedule 13.05.2014


Ответы (2)


Следующее будет использовать метатаблицу мета, чтобы явно обеспечить 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, пары

person Deduplicator    schedule 13.05.2014
comment
Спасибо! это должно ходить! - person user2872907; 13.05.2014

Код ниже пропускает некоторые записи. Адаптируйте по мере необходимости.

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 
person lhf    schedule 13.05.2014
comment
v должен быть местным. Кроме того, он отличается от pairs по умолчанию гораздо больше, чем нужно. - person Deduplicator; 13.05.2014
comment
Огромное спасибо. это даже лучше. :) - person user2872907; 13.05.2014