程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 詳解Lua中的元表概念

詳解Lua中的元表概念

編輯:更多關於編程

       這篇文章主要介紹了詳解Lua中的元表,是Lua入門學習中的基礎知識,需要的朋友可以參考下

      元表是一個表,有助於改變它連接到一個密鑰集和相關的元方法的幫助下表的行為。這些元方法是強大的lua功能,如:

      更改/添加功能,以運算符表

      查看metatables當鑰匙不在使用__index元表中的表可用。

      有跡象表明,在處理metatables其中包括使用了兩種重要的方法,

      setmetatable(table,metatable): 這個方法是用來設置元表的一個表。

      getmetatable(table): 此方法用於獲取表的元表。

      讓我們先來看看如何設置一個表作為另一個元表。它如下所示。

      代碼如下:

      mytable = {}

      mymetatable = {}

      setmetatable(mytable,mymetatable)

      上面的代碼可以在一個單一的行被表示為如下所示。

      代碼如下:

      mytable = setmetatable({},{})

      __index

      元表的查找元表時,它不是在表中提供一個簡單的例子如下所示。

      代碼如下:

      mytable = setmetatable({key1 = "value1"}, {

      __index = function(mytable, key)

      if key == "key2" then

      return "metatablevalue"

      else

      return mytable[key]

      end

      end

      })

      print(mytable.key1,mytable.key2)

      當我們運行上面的程序,會得到下面的輸出。

      代碼如下:

      value1 metatablevalue

      讓解釋發生了什麼事,在上面的例子中的步驟,

      該表mytable 這裡 {key1 = "value1"}.

      元表設置為mytable中包含一個函數 __index 我們稱之為元方法。

      元方法確實仰視的索引“key2”一個簡單的工作,如果找到,則返回“metatablevalue”,否則返回相應mytable索引的值。

      我們可以有上述程序的簡化版本,如下所示。

      代碼如下:

      mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })

      print(mytable.key1,mytable.key2)

      __newindex

      當我們增加__newindex到元表中,如果鍵是沒有在表中可用的,新的鍵的行為將被中繼的方法來定義。一個簡單的示例,其中元表的索引時,索引不是在主表可設定如下。

      代碼如下:

      mymetatable = {}

      mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })

      print(mytable.key1)

      mytable.newkey = "new value 2"

      print(mytable.newkey,mymetatable.newkey)

      mytable.key1 = "new value 1"

      print(mytable.key1,mymetatable.newkey1)

      當運行上面的程序,會得到如下的輸出。

       代碼如下:

      value1

      nil new value 2

      new value 1 nil

      可以在上面的程序看,如果一個關鍵存在於主表,它只是更新它。當一個鍵不可用在maintable,它添加了關鍵metatable。

      該更新用 rawset 函數相同的表的另一個例子如下所示。

       代碼如下:

      mytable = setmetatable({key1 = "value1"}, {

      __newindex = function(mytable, key, value)

      rawset(mytable, key, """..value..""")

      end

      })

      mytable.key1 = "new value"

      mytable.key2 = 4

      print(mytable.key1,mytable.key2)

      當我們運行上面的程序,會得到下面的輸出。

       代碼如下:

      new value "4"

      rawset 設定值,而不使用元表 __newindex。同樣有rawget,獲取的值,而無需使用__index。

      表加入操作符的行為

      一個簡單的例子結合使用+運算符的兩個表如下所示。

       代碼如下:

      mytable = setmetatable({ 1, 2, 3 }, {

      __add = function(mytable, newtable)

      for i = 1, table.maxn(newtable) do

      table.insert(mytable, table.maxn(mytable)+1,newtable[i])

      end

      return mytable

      end

      })

      secondtable = {4,5,6}

      mytable = mytable + secondtable

      for k,v in ipairs(mytable) do

      print(k,v)

      end

      當我們運行上面的程序,會得到下面的輸出

       代碼如下:

      1 1

      2 2

      3 3

      4 4

      5 5

      6 6

      該__add密鑰包含在元表中添加操作符+行為。表的鍵和相應的操作符如下所示。

    201552994741522.jpg (627×404)

      __call

      完成方法調用的添加行為,使用__call聲明。一個簡單的例子,返回值的主表的總和與傳遞表。

      代碼如下:

      mytable = setmetatable({10}, {

      __call = function(mytable, newtable)

      sum = 0

      for i = 1, table.maxn(mytable) do

      sum = sum + mytable[i]

      end

      for i = 1, table.maxn(newtable) do

      sum = sum + newtable[i]

      end

      return sum

      end

      })

      newtable = {10,20,30}

      print(mytable(newtable))

      當我們運行上面的程序,會得到下面的輸出。

       代碼如下:

      70

      __tostring

      更改打印語句的行為,可以用__toString元方法。一個簡單的例子如下所示。

       代碼如下:

      mytable = setmetatable({ 10, 20, 30 }, {

      __tostring = function(mytable)

      sum = 0

      for k, v in pairs(mytable) do

      sum = sum + v

      end

      return "The sum of values in the table is " .. sum

      end

      })

      print(mytable)

      當我們運行上面的程序,會得到下面的輸出。

      代碼如下:

      The sum of values in the table is 60

      如果知道元數據表的功能完全,真的可以執行很多操作,這將是不使用它非常復雜。所以盡量讓工作使用metatables在元表提供不同的選擇作為樣本的解釋,也可以創建自己的樣品。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved