添加 _ 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