校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Lua元表與元方法實例講解

Lua元表與元方法實例講解

熱門標簽:百度地圖標注位置網站 如何利用高德地圖標注家 開通400電話申請流程 揚州電銷外呼系統軟件 電腦外呼系統輻射大嗎 400手機電話免費辦理 上海企業外呼系統排名 智能語音電銷的機器人 武漢百應人工智能電銷機器人

Lua中提供的元表(metatable)與元方法(metamethod)是一種非常重要的語法,metatable主要用于做一些類似于C++重載操作符式的功能。

Lua中提供的元表是用于幫助lua變量完成某些非預定義功能的個性化行為,如兩個table的相加,通過讓兩者指向同一元表并修改該元表的元方法可以實現該功能。

任何table都可以成為任何值的元表,而一組相關的table也可以共享一個元表。

一些MetaMethod:

復制代碼 代碼如下:

__add(a, b)                     對應表達式 a + b
__sub(a, b)                     對應表達式 a - b
__mul(a, b)                     對應表達式 a * b
__div(a, b)                     對應表達式 a / b
__mod(a, b)                     對應表達式 a % b
__pow(a, b)                     對應表達式 a ^ b
__unm(a)                        對應表達式 -a
__concat(a, b)                  對應表達式 a .. b
__len(a)                        對應表達式 #a
__eq(a, b)                      對應表達式 a == b
__lt(a, b)                      對應表達式 a b
__le(a, b)                      對應表達式 a = b
__index(a, b)                   對應表達式 a.b
__newindex(a, b, c)             對應表達式 a.b = c
__call(a, ...)                  對應表達式 a(...)

1、算術類and關系類元方法

先看一個簡單的例子:

復制代碼 代碼如下:

--我們想讓兩個分數相加,這是一種非預定義的行為

fraction_a = {numerator=2, denominator=3}
fraction_b = {numerator=4, denominator=7}
fraction_op={}   --元表

-- __add這是metatable,這是lua內建約定的
function fraction_op.__add(a,b)   
  res={}
  res.numerator=a.numerator*b.denominator+b.numerator*a.denominator
  res.denominator=a.denominator*b.denominator
  return res
end

--將fraction_a,fraction_b的元表設置為fraction_op
--其中setmetatable是庫函數
setmetatable(fraction_a,fraction_op)
setmetatable(fraction_b,fraction_op)

--調用的是fraction_op.__add()函數
fraction_c=fraction_a+fraction_b
print(fraction_c.numerator.."/"..fraction_c.denominator)
--輸出結果
--26/21

再來看一個深度一點的例子,例舉了算數類的元方法,關系類的元方法,庫定義的元方法。

復制代碼 代碼如下:

Set={}

local metatable={}  --元表

--根據參數列表中的值創建一個新的集合
function Set.new(a)
   local set={}
   --將所有由該方法創建的集合的元表都指定到metatable
   setmetatable(set,metatable)
   for i,v in pairs(a) do
       set[v]=true
   end
   return set
end

--計算兩個集合的并集
function Set.union(a,b)
   local res=Set.new{}
   for i in pairs(a) do
      res[i]=true
   end
   for i in pairs(b) do
      res[i]=true
   end
   return res
end

--計算兩個集合的交集
function Set.intersect(a,b)
  local res=Set.new{}
  for i in pairs(a) do
     res[i]=b[i]
  end
  return res
end

--print總是調用tostring來格式化輸出
--這里我們稍作修改庫定義的print
function Set.tostring(a)
  local t={}
  for i in pairs(a) do
     t[#t+1]=i
  end
  return "{"..table.concat(t,",").."}"
end

--判斷a集合是否是b集合的子集
function Set.lessorequal(a,b)
   for i in pairs(a) do
       if  not b[i] then return false end
   end
   return true
end

--最后將重定向的元方法加入到元表中
metatable.__add=Set.union
metatable.__mul=Set.intersect
metatable.__tostring=Set.tostring
metatable.__le=Set.lessorequal
metatable.__eq=function(a,b) return a=b and b=a end
metatable.__lt=function(a,b) return a=b and not (b=a) end

s1=Set.new{2,9,8,4}
s2=Set.new{2,4,7}
s3=s1+s2
s4=s1*s2
print(s3)
print(s4)
print(3+4,3*4)  --新加的方法不改變表本身具有的方法,因為傳入的參數不同,只會讓元方法更完善
s5=Set.new{2,4}
s6=Set.new{2,4,6}
print(s5=s6)
print(s5s6)
print(s5==s6)
--輸出結果
--{2,8,4,9,7}
--{2,4}
--7  12
--true
--true
--false

2、table訪問的元方法:

算數類和關系類的元方法都為各自錯誤情況定義了行為,他們不會改變語言的常規行為,但lua還是提供了一種可以改變table的行為。有兩種可以改變table的行為:查詢table以及修改table中不存在的字段。

1)、__index元方法

   當訪問table中不存在的字段時,得到的結果為nil。如果我們為table定義了元方法__index,那訪問的結果將由該方法決定。

復制代碼 代碼如下:

Window={}
Window.prototype={x=10,y=20,width=100,height=200}
Window.mt={} --Window的元表

function Window.new(o)
  setmetatable(o,Window.mt)
  return o
end

Window.mt.__index=function(table,key)  return Window.prototype[key] end

w=Window.new{x=1,y=22}
print(w.width)
print(w.width1)
--輸出結果
--100
--nil

2)、__newindex元方法

和__index不同的是,該元方法用于不存在鍵的賦值,而前者用于訪問。

復制代碼 代碼如下:

Window={}
Window.prototype={x=10,y=20,width=100,height=200}
Window.mt={} --Window的元表

function Window.new(o)
  setmetatable(o,Window.mt)
  return o
end

Window.mt.__index=function(table,key)  return Window.prototype[key] end
Window.mt.__newindex=function(table,key,value) Window.prototype[key]=value end

w=Window.new{x=1,y=22}
w.length=50
print(w.width)
print(w.width1)
print(Window.prototype.length)
--輸出結果
--100
--nil
--50

您可能感興趣的文章:
  • Lua中使用元表(metatable)執行算術類元方法實例
  • Lua中的元表(metatable)、元方法(metamethod)詳解
  • Lua中的元表與元方法學習總結

標簽:延邊 江西 宜賓 黑龍江 武漢 張掖 新余 嘉峪關

巨人網絡通訊聲明:本文標題《Lua元表與元方法實例講解》,本文關鍵詞  Lua,元表,與,元,方法,實例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua元表與元方法實例講解》相關的同類信息!
  • 本頁收集關于Lua元表與元方法實例講解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩欧美一二区| 一区二区三区在线观看视频| 亚洲婷婷综合久久一本伊一区 | 日韩精品一区二区三区四区| 国产日产精品一区| 日韩av在线发布| 97超碰欧美中文字幕| 久久久久久久网| 青青青伊人色综合久久| 日本韩国欧美一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 日韩二区在线观看| 91国偷自产一区二区开放时间 | 午夜欧美在线一二页| 国产乱子轮精品视频| 欧美蜜桃一区二区三区| 亚洲色图欧洲色图| 国产精品一区二区在线观看不卡| 欧美日韩成人综合天天影院| 亚洲欧美一区二区三区孕妇| 国产aⅴ综合色| 日韩一区二区免费在线电影| 亚洲图片有声小说| 色综合色狠狠天天综合色| 亚洲天堂网中文字| 激情文学综合插| 日韩午夜av电影| 日韩精品欧美精品| 欧美日韩在线三级| 亚洲午夜精品17c| 日本韩国欧美一区| 夜夜精品视频一区二区| 色婷婷久久久综合中文字幕| 综合欧美一区二区三区| 99国产麻豆精品| 亚洲欧美日韩一区二区三区在线观看 | 欧美午夜一区二区| 一区二区三区美女视频| 色综合天天综合网天天看片| 国产精品久久久久久久久免费相片| 国产福利不卡视频| 国产精品美女久久久久av爽李琼| 成人精品gif动图一区| 中文字幕中文乱码欧美一区二区| www.欧美.com| 亚洲色图20p| 欧美丝袜自拍制服另类| 日韩国产精品久久| 亚洲精品一区在线观看| 国产91富婆露脸刺激对白| 亚洲视频网在线直播| 欧美精品在欧美一区二区少妇| 青青草国产精品亚洲专区无| 久久久久久亚洲综合| 91视频你懂的| 美女脱光内衣内裤视频久久网站| 久久综合五月天婷婷伊人| 丁香网亚洲国际| 亚洲小少妇裸体bbw| 欧美va亚洲va| 91亚洲国产成人精品一区二区三 | 欧美日韩成人综合天天影院 | 99国产欧美另类久久久精品| 亚洲成人av中文| 久久这里只有精品视频网| 99九九99九九九视频精品| 亚洲超碰97人人做人人爱| 久久久久免费观看| 欧美精品一级二级| 成人黄色软件下载| 美女视频一区在线观看| 欧美激情一区不卡| 欧美日韩不卡一区二区| 国产成人免费在线观看| 午夜精品国产更新| 国产精品蜜臀av| 日韩一级高清毛片| 色综合一个色综合亚洲| 精东粉嫩av免费一区二区三区| 18成人在线观看| 欧美精品一区二区精品网| 色乱码一区二区三区88| 国产一区二区在线影院| 一区二区成人在线视频| 日本一区二区三区久久久久久久久不| 欧美色手机在线观看| 岛国精品一区二区| 久久国产精品99久久久久久老狼| 亚洲免费av网站| 国产丝袜欧美中文另类| 日韩欧美亚洲一区二区| 色综合天天综合狠狠| 国产98色在线|日韩| 日本视频免费一区| 有码一区二区三区| 国产精品每日更新在线播放网址| 欧美哺乳videos| 欧美日韩国产在线观看| 91丨porny丨中文| 成人高清视频免费观看| 国产福利一区二区三区在线视频| 免费高清在线一区| 日韩成人av影视| 亚洲一区二区欧美激情| 亚洲欧美一区二区在线观看| 国产三级精品在线| 久久九九久久九九| 久久综合色8888| 精品1区2区在线观看| 制服丝袜成人动漫| 91精品欧美久久久久久动漫 | 午夜国产精品影院在线观看| 一区二区三区不卡视频| 亚洲乱码国产乱码精品精98午夜| 中文字幕一区二区三区在线不卡 | 国产九色sp调教91| 久久97超碰色| 久久国产精品一区二区| 国产一区二区在线视频| 国产成人亚洲综合a∨婷婷| 国产成人免费视频精品含羞草妖精| 美女免费视频一区| 麻豆精品新av中文字幕| 精品一区二区三区蜜桃| 国产一区二区三区美女| 国产福利一区二区三区| 成人h版在线观看| 色婷婷激情久久| 欧美伦理电影网| 精品国产精品网麻豆系列| 久久综合久久综合久久综合| 国产精品免费人成网站| 亚洲另类在线一区| 亚洲一区视频在线| 免费观看30秒视频久久| 国产高清精品网站| 91成人免费在线| 555www色欧美视频| 国产日产精品1区| 亚洲一区二区三区激情| 久久99在线观看| 9人人澡人人爽人人精品| 欧美日韩成人一区| 国产丝袜美腿一区二区三区| 成人欧美一区二区三区| 日韩av成人高清| 成人av电影在线| 欧美日韩高清一区二区| 国产日韩欧美电影| 亚洲主播在线观看| 国产在线视频一区二区三区| 91网站在线观看视频| 日韩欧美高清在线| 亚洲黄一区二区三区| 久久爱www久久做| 色婷婷久久一区二区三区麻豆| 精品少妇一区二区三区免费观看 | 国产综合久久久久影院| 91美女福利视频| 精品少妇一区二区三区免费观看 | 在线精品视频小说1| 精品久久久久久久人人人人传媒| 亚洲婷婷在线视频| 国产成人午夜精品5599 | 精品伊人久久久久7777人| 色爱区综合激月婷婷| 久久亚洲一区二区三区明星换脸 | 欧美色国产精品| 久久精品视频一区二区| 亚洲成人你懂的| 丁香天五香天堂综合| 精品日韩一区二区| 亚洲无人区一区| 99精品久久久久久| 国产亚洲成av人在线观看导航| 日韩精品三区四区| 欧美揉bbbbb揉bbbbb| 中文字幕一区二区三| 国产精品综合视频| 欧美一区二区私人影院日本| 一区二区三区丝袜| 成人黄色在线网站| 亚洲国产精品国自产拍av| 寂寞少妇一区二区三区| 欧美精品一二三四| 亚洲成人免费电影| 91极品美女在线| 亚洲精品成人精品456| k8久久久一区二区三区| 国产精品网站导航| 国产一区二区三区黄视频| 日韩欧美美女一区二区三区| 午夜精品久久久久久久久| 91国偷自产一区二区开放时间 | 国产精品二三区| 成人免费精品视频| 欧美国产日韩在线观看| 国产精品亚洲午夜一区二区三区| 精品乱码亚洲一区二区不卡| 日本成人中文字幕|