Lua元表问题

我有一个工作定义的元表(见下文),但我无法使它像我想要的那样运行。当我将一组值提供给ht.array(见下文)时,它能正常工作。当我尝试给它一个表格时,它不起作用,显然因为它期望一个值范围而不是一个嵌套的表格。但是,即使我修改ht.array以摆脱嵌套的表格(如a = a [1]),它也无法正常工作。有什么想法吗?非常感谢!总之,我想要的是v1 = ht.array {{1,2,3}},其中当我执行v1 + v1时它会起作用。

ht = {}
local mt = {}

function ht.array (a)
    array = {}
    setmetatable(array, mt)
    for k, v in ipairs(a) do
        array[k] = v
    end
    return array
end

function ht.add (a, b)
    local res = ht.array{}
    for k in pairs(a) do res[k] = a[k] + b[k] end
    return res
end

mt.__add = ht.add

-- 这个能正常工作
v1 = ht.array{4,5,6}
v2 = ht.array{3,45,90}

c = v1 + v2

for k, v in ipairs(c) do
    print(v)
end

-- 但是这个不能正常工作
a = {3,4,5}
b = {9,1,11}
v1 = ht.array{a}
v2 = ht.array{b}

c = v1 + v2

for k, v in ipairs(c) do
    print(v)
end

原文链接 https://stackoverflow.com/questions/5560294

点赞
stackoverflow用户4323
stackoverflow用户4323

首先,为什么不直接这样做?

v1 = ht.array(a)
v2 = ht.array(b)

这样,您会使用表格而不是包含另一个表格的单个元素表格来调用“array”函数(顺便说一句,“array”是奇怪的名称)。但是,如果您确实希望它支持包含另一个表格的单个元素表格,可以在ht.array的顶部添加此快捷方式:

if type(a[1]) == 'table' then
    a = a[1]
end
2011-04-06 01:25:52