天天看點

lua元表和元方法 《lua程式設計》 13章 讀書筆記

lua中每個值都有一個元表,talble和userdata可以有各自獨立的元表,而其它類型的值則共享其類型所屬的單一進制表。lua在建立table時不會建立元表。

<a></a>

任何table可以作為任何值的元表,而一組相關的table可以共享一個通用的元表,此元表描述了一個共同的行為。一個tabel甚至可以作為它自己的元表,用于描述其特有行為。

在lua中,隻能設定table的元表。要設定其它類型的元表,必須通過C代碼來完成

關系是指 __eq(等于)、__lt(小于)等

tostring是一個典型的執行個體。它能将各種類型的值表示為簡單的文本格式

函數總是調用tostring來格式化輸出。當格式化任意值時,tostring會檢測該值是否有一個 __tostring元方法。如果有,他就調用這個方法用來作為tostring的傳回值

在集合執行個體中,我們定議了将任命表示為字元串的方法,我們可以設定元表的__tostring字段

假設想要保護集合的元表,使使用者即不能看也不能修改集合的元表。那麼就需要用到__metatable。當設定了該字段時,getmetatable就會傳回這個字段的值,而setmetatable會引發一個錯誤

當通路一個table中不存在的字段中時,如果這個字段不存在得到nil,但是如果這個table有一個元方法__index那麼如果沒有這個字段,就由這個元方法來提供結果

__index元方法還可以是一個table

與__index不同的是__index是在查詢的時候用的而_newindes是在更新的時候用的

以下代碼為table設定預設值

__index和__newindex都是在table中沒有所需的index才發揮作用。因為隻有table保持空才能捕捉到所有對他的通路,為了監視一個table的所有通路就得為真正的 table 建立一個代理

隻讀table與上一節跟蹤table類似,是通過__newindex來限制修改table記憶體

繼續閱讀