3

就像一个随机实验一样,我正在考虑向元表添加一个__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 );

附加问题:我有什么方法可以...按值填充值(以消除上面示例中对表格和解包的需要)?

4

1 回答 1

3

您的想法可以使用__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
于 2015-08-23T23:39:27.613 回答