Lua中的metatable介紹

2022-09-26 18:33:17 字數 1481 閱讀 7641

setmetatable (table, metatable)

lua 中的每個值都可以用乙個 metatable。 這個 metatable 就是乙個原始的 lua table , 它用來定義原始值在特定操作下的行為。 你可以通過在 metatable 中的特定域設一些值來改變擁有這個 metatable 的值 的指定操作之行為。 舉例來說,當乙個非數字的值作加法操作的時候, lua 會檢查它的 metatable 中 "__add" 域中的是否有乙個函式。 如果有這麼乙個函式的話,lua 呼叫這個函式來執行一次加法。

我們叫 metatable 中的鍵名為 事件 (event) ,把其中的值叫作 元方法 (程式設計客棧metamethod)。 在上個例子中,事件是 "add" 而元方法就是那個執行加法操作的函式。

你可以通過 getmetatable 函式來查詢到任何乙個值的 metatable。

你可以通過 setmetatable 函www.cppcns.com數來替換掉 table 的 metatable 。 你不能從 lua 中改變其它任何型別的值的 metatable (使用 debug 庫例外); 要這樣做的話必須使用 c api 。

每個 table 和 userdata 擁有獨立的 metatable (當然多個 table 和 userdata 可以共享乙個相同的表作它們的 metatable); 其它所有型別的值,每種型別都分別共享唯一的乙個 metatable。 因此,所有的數字一起只有乙個 metatable ,所有的字串也是,等等。

乙個 metatable 可以控制乙個物件做數**算操作、比較操作、連線操作、取長度操作、取下標操作時的行為, metatable 中還可以定義乙個函式,讓 userdata 作垃圾收集時呼叫它。 對於這些操作,lua 都將其關聯上乙個被稱作事件的指定健。 當 lua 需要對乙個值發起這些操作中的乙個時, 它會去檢查值中 metatable 中是否有對應事件。 如果有的話,鍵名對應的值(元方法)將控制 lua 怎樣做這個操作。

metatable 可以控制的操作已在下面程式設計客棧列出來。 每個操作都用相應的名字區分。 每個操作的鍵名都是用操作名字加上兩個下劃線 '__' 字首的字串; 舉例來說,"a" 操作的鍵名就是字串 "__add"。 這些操作的語義用乙個 lua 函式來描述直譯器如何執行更為恰當。

setmetatable

sets the metatable for the given table. (you cannot change the metatable of other types from lua, only from c.) if metatable is nil, removes the metatable of the given table. if the original metatable has a "__metatable" field, raises an error.

this function returns table.

本文標題: lua中的metatable介紹

本文位址: /jiaoben/lua/123225.html

Lua中的元表Metatable 2

1 關係運算的metamethod 2 庫定義的metamethod print函式 呼叫tostring來格式化輸出 預設以最簡輸出 當格式化乙個物件時,會檢查物件是否有乙個帶 tostring域的metatale。如果有則以物件作為引數,呼叫對應的函式完成格式化,返回tostring結果。3 判...

Lua元表metatable理解

index元方法 總結 newindex 元方法 call 元方法 定義元方法 call 最近總是遇到如果通過指令碼語言搭建乙個oop結構,於是針對lua進行了解,發現需要用到其元表metatable來實現,則對lua的metatable進行乙個理解的整理 理解 名稱 元表,本身也是乙個table ...

0基礎lua學習(十三)Metatable

在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。因此 lua 提供了元表 metatable 允許我們改變table的行為,每個行為關聯了對應的元方法。mytable 普通表 mymetatable 元表 setmetatable myt...