在一些庫中,在自己的metatables中定義自己的域是很普遍的情況。到目前為止,我們看到的所有metamethods都是lua核心部分的。有虛擬機器負責處理運算子涉及到的metatables和為運算子定義操作的metamethods。但是,metatable是乙個普通的表,任何人都可以使用。
tostring是乙個典型的例子。如前面我們所見,tostring以簡單的格式表示出table:
print({}) --> table: 0x8062ac0
(注意:print函式總是呼叫tostring來格式化它的輸出)。然而當格式化乙個物件的時候,tostring會首先檢查物件是否存在乙個帶有__tostring域的metatable。如果存在則以物件作為引數呼叫對應的函式來完成格式化,返回的結果即為tostring的結果。
在我們集合的例子中我們已經定義了乙個函式來將集合轉換成字串列印出來。因此,我們只需要將集合的metatable的__tostring域呼叫我們定義的列印函式:
set.mt.__tostring = set.tostring
這樣,不管什麼時候我們呼叫print列印乙個集合,print都會自動呼叫tostring,而tostring則會呼叫set.tostring:
s1 = set.new
print(s1) -->
setmetatable/getmetatable函式也會使用metafield,在這種情況下,可以保護metatables。假定你想保護你的集合使其使用者既看不到也不能修改metatables。如果你對metatable設定了__metatable的值,getmetatable將返回這個域的值,而呼叫setmetatable 將會出錯:
set.mt.__metatable = "not your business"
s1 = set.new{}
print(getmetatable(s1)) --> not your business
setmetatable(s1, {})
stdin:1: cannot change protected metatable
原文:lua乙個小巧指令碼語言學習筆記
lua教程庫定義的metamethods-54
lua類的定義
lua類的定義 如下 local clsnames local setmetatable setmetatable local getmetatable getmetatable function class classname,basecls if classname nil then bxlog...
lua方法的定義 呼叫
冒號和點來定義個方法 當通過冒號定義方法的時候 預設傳乙個引數 self 而使用點定義的時候則不會傳遞乙個預設的self。使用冒號定義方法,可以使用點來呼叫,如果不顯式的把自身當做第乙個引數傳遞的話,那麼就會把第乙個引數當做自身賦值給self 引數就會少乙個。使用點定義的方法 也可以使用冒號呼叫,但...
在Mac OS中安裝Lua的教程
lua 是乙個輕量級的程式語言,在遊戲開發上使用非常多。在這篇文章中,我們將向你介紹在 mac os x 系統上安裝和使用最新版本的 lua 5.2.1。如果你的系統已經安裝了 rudix,只需要執行 sudo rudix install lua 即可,否則 rudix 提供一些獨立的軟體包用來安裝...