【问题标题】:Why won't __add work?为什么不 __add 工作?
【发布时间】:2016-03-11 08:46:31
【问题描述】:

所以我正在尝试学习 lua 中的元表,所以我决定学习一些教程。我正在尝试元表的 __add 部分。但由于某种原因,我不断收到错误(尝试在字段上执行算术(nil)

aTable = {}
--Assign the values for the normal table 
for x = 1, 10 do 
    aTable[x] = x
end 

-- metatable
mt = {__add = function(table1, table2)
    sumTable = {}
    for i = 0, #table1 do
        sumTable[i] = table1[i] + table2[i]
    end
    return sumTable
end}


setmetatable(aTable, mt)

newTable = {}

newTable = aTable + aTable

for x = 1, #newTable do 
    print(newTable[x])
end 

在这一点上我很困惑。帮助将不胜感激

【问题讨论】:

    标签: lua


    【解决方案1】:

    在 __add-function 中应该是:

    for i = 1, #table1 do
    

    因为您最初没有设置 table[0],而是从索引 1 开始(确实推荐用于 lua-pseudoarrays,许多操作都依赖它)

    【讨论】:

    • 啊非常感谢!我只是为了java的数组,它们都从0开始
    【解决方案2】:

    @Ctx 是正确的,问题在于数组初始化和添加函数中的索引不同。但修复它的最佳方法是修改 __add 函数以处理传递的数组中的“空洞”,方法是检查其中的 nil 条目。

      for i = 0, #table1 do
        if (table1[i] and table2[i]) then
          sumTable[i] = table1[i] + table2[i]
        end
      end 
    

    【讨论】:

    • 感谢您的意见,我会尽量采纳您的建议
    【解决方案3】:

    缺少的另一件事是:您没有在结果上设置相同的元表,这意味着虽然 aTable+aTableaTable+aTable+aTable 等会起作用,但 aTable+aTable+(aTable+aTable) 会失败。

    更正和清洁的版本:

    -- metatable
    mt = {
        __add = function( table1, table2 )
            sumTable = {}
            for i = 1, #table1 do
                sumTable[i] = table1[i] + table2[i]
            end
            return setmetatable( sumTable, mt )
        end,
    }
    
    aTable = setmetatable( {}, mt )
    --Assign the values for the normal table 
    for x = 1, 10 do  aTable[x] = x  end 
    
    newTable = aTable + aTable
    
    for x = 1, #newTable do  print( newTable[x] )  end
    
    -- and a test for what would have failed:
    yetAnotherTable = newTable + newTable
    for x = 1, #yetAnotherTable do  print( yetAnotherTable[x] )  end
    

    【讨论】:

    • 感谢您的建议。我一定会在我未来的代码中实现你的建议!
    猜你喜欢
    • 2018-02-23
    • 2016-11-19
    • 1970-01-01
    • 2015-06-15
    • 2013-06-01
    • 2011-09-29
    • 2014-05-16
    • 2011-01-21
    • 2011-04-04
    相关资源
    最近更新 更多