Lua自定义数字串联

4

我一直在学习Lua中的元表,并且想要像Ruby一样实现范围运算符,因此我使用了这个模型。

debug.setmetatable(1, {
    __concat = function(a, b) 
        if a > b then
            error(table.concat({
                "attempt to create a range of values with a",
                "minimum larger than the maximum"
            }, " "))
        elseif a == b then
            return a
        else
            return unpack((function(nStart,nEnd)
                local nTable = {}
                for it = nStart,nEnd do
                    table.insert(nTable, it)
                end
                return nTable
            end)(a, b))
        end
    end
})

print(6 .. 6) 

但是看起来它似乎继续使用默认行为。有没有办法让它工作?我知道我可以编写一个函数来模拟这种行为,然后使用range(n,n2)或类似的方式调用它,但这违背了初衷。谢谢。

1个回答

4
请查看Lua 5.2手册的第3.4.5节section 3.4.5
Lua中的字符串连接运算符用两个点('..')表示。如果两个操作数都是字符串或数字,则根据§3.4.2中提到的规则将它们转换为字符串。否则,调用__concat元方法(参见§2.4)。
如果您想更改此行为,请查看lvm.c,特别是luaV_concat函数。lvm.c

谢谢,我不认为我能轻易地改变这种行为? - Hal
1
你需要查找代码生成器中安排tostring()效果接近拼接的基础工作。Lua源代码有相当不错的注释,但这并不是小菜一碟的。第一步应该是消除自动转换为字符串,第二步应该是扩大使用__concat - RBerteig
1
@Hal 可以做到,但你至少需要了解一些 C 语言。请查看我的答案补充说明。尽管如此,这可能需要比制作一个简单的“range”函数更多的工作。语法糖也有其代价。 - Ryan Stein
是的,你说得对。我查看了索引函数,但n没有那么多魅力,而且它似乎只能返回一个值。谢谢你的帮助,我可能最终会使用一个命名函数。 - Hal
2
我想你不会满足于像 range(6, 6) 这样的东西吧?或者试试 r [[6..6]]? :P - greatwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接