加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua – 运算符重载不起作用

发布时间:2020-12-14 21:48:22 所属栏目:大数据 来源:网络整理
导读:在Lua中阅读Programming时,我尝试了本书中给出的运算符重载的例子 Set = {}mt = {}mt.__add = Set.union--create a new set with the values of the given listfunction Set.new (l) local set = {} setmetatable (set,mt) for _,v in ipairs (l) do set [v]
在Lua中阅读Programming时,我尝试了本书中给出的运算符重载的例子

Set = {}

mt = {}
mt.__add = Set.union

--create a new set with the values of the given list
function Set.new (l) 
    local set = {}
    setmetatable (set,mt)
    for _,v in ipairs (l) do 
        set [v] = true
    end
    return set
end 

function Set.union (a,b)
    local result = Set.new {}
    for k in pairs (a) do result [k] = true end
    for k in pairs (b) do result [k] = true end
    return result
end

function Set.intersection (a,b)
    local result = Set.new {}
    for k in pairs (a) do result [k] = b[k] end
    return result
end

function Set.tostring (set)
    local l = {}
    for e in pairs (set) do
        l[#l + 1] = e
    end
    return "{" .. table.concat (l,",") .. "}"
end 

function Set.print (s)
    print (Set.tostring (s))
end 

s1 = Set.new {10,20,30,50}
s2 = Set.new {30,1}

Set.print (s1)
Set.print (s2)

s3 = s1 + s2
Set.print (s3)

但是对于Windows的最新lua我收到以下错误

lua: C:meta.lua:47: attempt to perform arithmetic on global 's1' (a table value)
stack traceback:
    C:meta.lua:47: in main chunk
    [C]: ?
{30,10,50}
{1,30}

解决方法

你过早地做这个任务:

mt.__add = Set.union

因为Set.union尚未初始化.

将其移至Set.union下方,它将起作用.

出于同样的原因,如果你指定mt .__ mul,那么它应该低于Set.intersection

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读