Просто в качестве случайного эксперимента я рассматриваю возможность добавления метаметода __concat()
в метатаблицу number
(обычно это новая метатаблица, поскольку числа по умолчанию не имеют метатаблиц?).
Идея состоит в том, что я мог бы сделать что-то вроде 3..5
и получить обратно 3, 4, 5
.
Затем я мог бы иметь функцию foo(tbl, ...)
, которая что-то делает с несколькими индексами в таблице, и вызывать ее как foo(tbl, 3..5)
.
Я лаю с ума или это похоже на жизнеспособную вещь?
Набросок кода (еще не проверял):
-- get existing metatable if there is one
local m = getmetatable( 0 ) or {};
-- define our concat method
m.__concat = function( left, right )
-- note: lua may pre-coerce numbers to strings?
-- http://lua-users.org/lists/lua-l/2006-12/msg00482.html
local l, r = tonumber(left), tonumber(right);
if not l or not r then -- string concat
return tostring(left)..tostring(right);
else -- create number range
if l > r then l, r = r, l end; -- smallest num first?
local t = {};
for i = l, r do t[#t+1] = i end;
return (table.unpack or unpack)(t);
end
end
-- set the metatable
setmetatable( 0, m );
Дополнительный вопрос: есть ли способ заполнить значение ...
значением (чтобы устранить необходимость в таблице и распаковать в приведенном выше примере)?
3 .. 5
никогда не будет включать метаметод__concat
,3 .. 5
всегда будет равно строке35
. - person Egor Skriptunoff   schedule 24.08.2015LUA_NOCVTN2S
при компиляции lua. - person daurnimator   schedule 24.08.2015