添加 _ concat 两个数字来创建数字范围 - 我疯了吗?
Adding _concat to numbers to create number ranges - am I mad?
就像一个随机实验一样,我正在考虑向 number
元table 添加一个 __concat()
元方法(通常是一个新的元 table,因为数字不会默认情况下似乎有 metatables?)。
我的想法是我可以做类似 3..5
的事情然后返回 3, 4, 5
。
然后我可以有一个函数 foo(tbl, ...)
,它在 table 上使用多个索引做一些事情,并像 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 );
其他问题:我有什么方法可以按值填充 ...
值(以消除对 table 的需求并在上面的示例中解压)?
您的想法可以使用 __call
元方法实现:
local mt = debug.getmetatable(0) or {}
mt.__call = function(a,b) -- a, b - positive integer numbers
return (('0'):rep(a-1)..('1'):rep(b-a+1)):match(('()1'):rep(b-a+1))
end
debug.setmetatable(0, mt)
-- Example:
print((3)(5)) --> 3 4 5
就像一个随机实验一样,我正在考虑向 number
元table 添加一个 __concat()
元方法(通常是一个新的元 table,因为数字不会默认情况下似乎有 metatables?)。
我的想法是我可以做类似 3..5
的事情然后返回 3, 4, 5
。
然后我可以有一个函数 foo(tbl, ...)
,它在 table 上使用多个索引做一些事情,并像 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 );
其他问题:我有什么方法可以按值填充 ...
值(以消除对 table 的需求并在上面的示例中解压)?
您的想法可以使用 __call
元方法实现:
local mt = debug.getmetatable(0) or {}
mt.__call = function(a,b) -- a, b - positive integer numbers
return (('0'):rep(a-1)..('1'):rep(b-a+1)):match(('()1'):rep(b-a+1))
end
debug.setmetatable(0, mt)
-- Example:
print((3)(5)) --> 3 4 5