lua面試題


在 Lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。

因此 Lua 提供了元表(Metatable),允許我們改變table的行為,每個行為關聯了對應的元方法。

例如,使用元表我們可以定義Lua如何計算兩個table的相加操作a+b。

當Lua試圖對兩個表進行相加時,先檢查兩者之一是否有元表,之后檢查是否有一個叫"__add"的字段,若找到,則調用對應的值。"__add"等即時字段,其對應的值(往往是一個函數或是table)就是"元方法"。

有兩個很重要的函數來處理元表:

  • setmetatable(table,metatable): 對指定table設置元表(metatable),如果元表(metatable)中存在__metatable鍵值,setmetatable會失敗 。
  • getmetatable(table): 返回對象的元表(metatable)。

__index 元方法

這是 metatable 最常用的鍵。

當你通過鍵來訪問 table 的時候,如果這個鍵沒有值,那么Lua就會尋找該table的metatable(假定有metatable)中的__index 鍵。如果__index包含一個表格,Lua會在表格中查找相應的鍵。

Lua查找一個表元素時的規則,其實就是如下3個步驟:

  • 1.在表中查找,如果找到,返回該元素,找不到則繼續
  • 2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續。
  • 3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重復1、2、3;如果__index方法是一個函數,則返回該函數的返回值。

__newindex 元方法

__newindex 元方法用來對表更新,__index則用來對表訪問 。

當你給表的一個缺少的索引賦值,解釋器就會查找__newindex 元方法:如果存在則調用這個函數而不進行賦值操作。

__call 元方法

__call 元方法在 Lua 調用一個值時調用。

__tostring 元方法

__tostring 元方法用於修改表的輸出行為。


免責聲明!

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



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