在Lua中進行運算符重載


在C++里面運算符是可以重載的,這一點也是C++比較方便的一個地方。在Lua中其實也是可以模擬出運算符的重載的。

在Lua中table中元素的運算都是和一個叫做元表有關的,在一個table型的變量上都有一個元表,在元表中存放着該變量的

元函數,在進行運算是,就是利用元表中的這些元函數進行的,比如對兩個元素進行加法操作,實際上就是調用在元表中

的一個元函數__add()來實現的。所以通過對這種情況的了解,我們可以很方便的對table元素的元表進行重新的設定,

從而實現重載運算符的目的。

並且table可以用來模擬非常多的數據結構,這樣就使得Lua的重載可以發揮出非常強大的實力。

下面以定義一個集合類型為例來演示Lua 1 Set = { 2 ops = {}

 3  4 function Set.new (data)  5 local set = {}  6 setmetatable(set, ops)  7 for _, value in ipairs(data) do set[value] = true end  8 return set  9 end 10 11 function Set.union (a, b) 12 local set = {} 13 for k in ipairs(a) do set[k] = true end 14 for k in ipairs(b) do set[k] = true end 15 return set 16 end 17 18 function Set.tostring(set) 19 local l = {} 20 for e in pairs(set) do 21 l[#l + 1] = e 22 end 23 return "{" .. table.concat(l, ", ") .. "}" 24 end 25 26 function Set.equal (a, b) 27 for k in ipairs(a) do 28 if not b[k] then 29 return false 30 end 31 end 32 return true 33 end 34 35 function override() 36 ops.__add = Set.union 37 ops.__tostring = Set.tostring 38 ops.__eq = Set.equal 39 end 40 override()
41 s1 = Set.new ({10, 20, 30, 40, 50}) 42 s2 = Set.new ({10, 20, 30, 40, 50}) 43 44 s3 = s1 + s2 45 46 print (s3) 47 48 if s1 == s2 then 49 print ("s1 == s2") 50 else 51 print ("s1 ~= s2") 52 end

這樣就可以實現對運算符的一個簡單重載,可以重載的方法還有很多,比如

__add: 對+進行重載

__sub: 對-進行重載

__mul: 對*進行重載

__div: 對/進行重載

__unm: 對相反數進行重載

__mod: 對%進行重載

__pow: 對^進行重載

__concat: 對連接操作符進行重載

__eq: 對==進行重載

__lt: 對<進行重載

__le: 對<=進行重載

__tostring: 類似於C++中對<<的重載 只要做了該重載,在使用print時就會使用對應的函數做處理后再輸出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM