在数字后面添加_concat来创建数字范围-我疯了吗?

就像一个随机实验一样,我考虑为number metatable(通常是一个新的metatable,因为数字似乎默认没有metatable)添加一个__concat() metamethod。

这个想法是,我可以像这样做3..5,然后得到3, 4, 5

然后我可以有一个函数foo(tbl, ...),在表上执行多个索引操作,并像foo(tbl, 3..5)这样调用它。

我是不是疯了,还是这似乎是可行的?

代码的初步草案(尚未测试):

- 获取现有metatable(如果存在)
local m = getmetatable(0)或{};

- 定义我们的concat方法
m.__concat = function(left,right)
    - 注意:Lua可以将数字预转换为字符串吗?
    - http://lua-users.org/lists/lua-l/2006-12/msg00482.html
    local l, r = tonumber(left),tonumber(right);

    如果l或r为nil,则返回字符串连接
        返回tostring(left)..tostring(right);

    其次-创建数字范围
        如果l>r,则首先用最小的数?
        本地t = {};
        for i = l,r do t[#t + 1] = i end;
        return(table.unpack or unpack(t));

结束
end

- 设置metatable
setmetatable0,m);

附加问题:我是否有办法逐个填充“...”值(以消除上面示例中表格和解包的需要)?

点赞
用户1847592
用户1847592

你的想法可以使用__call元方法实现:

local mt = debug.getmetatable(0) or {}
mt.__call = function(a,b)  -- a, b - 正整数
   return (('0'):rep(a-1)..('1'):rep(b-a+1)):match(('()1'):rep(b-a+1))
end
debug.setmetatable(0, mt)

-- 示例:
print((3)(5))  -->  3  4  5
2015-08-23 23:39:27