此初版是為 Lua 5.0 編寫的。儘管對後續版本仍有很大的關聯性,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買此書,您也可以協助 支援 Lua 專案。
![]() |
Lua 中的程式設計 | ![]() |
第二部分。資料表和物件 第 17 章。弱資料表 |
弱資料表的另一個重要用途是將屬性與物件關聯起來。在許多情況下,我們需要將一些屬性附加到物件上:函式的名稱、資料表的預設值、陣列的大小等等。
當物件是資料表時,我們可以使用適當的唯一金鑰將屬性儲存在資料表本身中。如前所述,建立唯一金鑰的簡單且防呆的方法是建立一個新的物件(通常是資料表),並將其用作金鑰。但是,如果物件不是資料表,則無法保留其自己的屬性。即使對於資料表,有時我們可能不想將屬性儲存在原始物件中。例如,我們可能希望保持屬性私密,或者我們不希望屬性干擾資料表遍歷。在所有這些情況下,我們需要一種替代方法來將屬性關聯到物件。當然,外部資料表提供了一種將屬性關聯到物件的理想方式(資料表有時稱為關聯陣列,這並非偶然)。我們使用物件作為金鑰,並使用其屬性作為值。外部資料表可以保留任何類型的物件屬性(因為 Lua 允許我們使用任何類型的物件作為金鑰)。此外,儲存在外部資料表中的屬性不會干擾其他物件,並且可以與資料表本身一樣私密。
然而,這個看似完美的解決方案有一個很大的缺點:一旦我們將物件用作表格中的金鑰,我們就將物件鎖定在存在中。Lua 無法收集正用作金鑰的物件。如果我們使用一般表格將函式關聯到其名稱,這些函式將永遠無法被收集。正如你所預期的,我們可以使用弱表格來避免這個缺點。然而,這次我們需要弱金鑰。使用弱金鑰不會阻止任何金鑰被收集,只要沒有其他對它的參照。另一方面,表格不能有弱值;否則,活物件的屬性可能會被收集。
Lua 本身使用此技術來維持用作陣列的表格大小。正如我們稍後將看到的,表格函式庫提供一個函式來設定陣列的大小,另一個函式來取得此大小。當你設定陣列的大小時,Lua 會將此大小儲存在一個私有弱表格中,其中索引是陣列本身,而值是其大小。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |