pairs()
возвращает три отдельных значения:
- функция для вызова с параметрами
(table, key)
, которая возвращает ключ и значение - таблицы, которую вы передали ей
- первое значение ключа для передачи в функцию (ноль для пар (), 0 для ipairs ())
Примерно так:
for k,v in pairs({a=1, b=13, c=169}) do print(k, v) end
Это можно сделать следующим образом:
local f,t,k = pairs({a=1, b=13, c=169})
local v
print('first k: '..tostring(k))
k,v = f(t, k)
while k ~= nil do
print('k: '..tostring(k)..', v: '..tostring(v))
k,v = f(t, k)
end
Результаты:
first k: nil
k: c, v: 169
k: b, v: 13
k: a, v: 1
И вам не нужно принимать аргумент, здесь есть инструкции if для каждого значения:
function mypairs()
-- the function returned should take the table and an index, and
-- return the next value you expect AND the next index to pass to
-- get the value after. return nil and nil to end
local myfunc = function(t, val)
if val == 0 then return 1, 'first' end
if val == 1 then return 2, 'second' end
if val == 2 then return 3, 'third' end
return nil, nil
end
-- returns a function, the table, and the first value to pass
-- to the function
return myfunc, nil, 0
end
for i,v in mypairs() do
print('i: '..tostring(i)..', v: '..tostring(v))
end
-- output:
-- i: 1, v: first
-- i: 2, v: second
-- i: 3, v: third
Для вашего mypairs(list)
вы можете просто продолжать вызывать функцию, возвращаемую из пар, до тех пор, пока у ключа есть подчеркивание, чтобы получить следующее значение:
local function mypairs( list )
local f,t,k = pairs(list)
return function(t,k)
local a,b = f(t, k)
while type(a) == 'string' and a:sub(1,1) == '_' do a,b = f(t,a) end
return a,b
end, t, k
end
local list = {a=5, _b=11, c = 13, _d=69}
for k,v in mypairs(list) do print(k, v) end
-- output:
-- c 13
-- a 5
Документы, на которые вы ссылаетесь, чтобы иметьитератор, который возвращает только одно значение, а pairs()
возвращает 2, но вы можете вернуть больше, если хотите.Конструкция for ... in ...
будет выполнять тело, только если первое значение не равно нулю.Вот версия, которая также возвращает пропущенные ключи, тело не будет выполнено, если вы не получите действительное значение, хотя, возможно, вы не увидите все клавиши _:
local function mypairs( list )
local f,t,k = pairs(list)
return function(t,k)
local skipped = {}
local a,b = f(t, k)
while type(a) == 'string' and a:sub(1,1) == '_' do
table.insert(skipped, a)
a,b = f(t,a)
end
return a,b,skipped
end, t, k
end
local list = {a=5, _b=11, c = 13, _d=69}
for k,v,skipped in mypairs(list) do
for i,s in ipairs(skipped) do
print('Skipped: '..s)
end
print(k, v)
end