2016-03-10 38 views
4

__index訪問爲永恆不變的,當被調用時:元方法訪問作爲可變關鍵

local foo = bar["foo"]; 

__newindex被稱爲訪問時,作爲可變指標不存在:

local bar = { } 
bar["foo"] = 123 -- calls __newindex 
bar["foo"] = 456 -- does NOT call __newindex 

是否有元方法可以在訪問某個鍵時被調用爲易變的evey時間,也就是說,不僅如果鍵不存在嗎?

我想創建一個行爲,以便當用戶在表中設置一個鍵時,它會調用本地方法,而不管該鍵是否已經存在。

+0

__index和__newindex僅在密鑰沒有與其關聯的值時觸發。 – warspyking

回答

3

執行所需操作的標準方法是使用代理表,即使用適當的元方法訪問實際表的空表。由於代理是空的,所以每當你獲取或設置字段時都會調用元方法。

+0

謝謝。我忘了提及我不需要用戶放在表中的值實際存在於表中。這些值將存儲在本機代碼中,因此有一個空表是我需要的,因爲它每次都會觸發__newindex,並且不會在C和Lua代碼中複製數據。我會遠去的。 – Virus721

1

我相當確定你沒有找到這樣的metamethods。 但是,你可以嘗試做一個解決方法來獲得你想要的。

例如,您可以嘗試使用__call元方法以這樣的方式

local mt = {} 
function mt.__call(tbl, key, val) 
    -- this is called every time you use bar(key, val) 
    tbl[key] = val 
end 

local bar = setmetatable({}, mt) 

bar("foo", 123) 
bar("foo", 456) 

print(bar.foo) 

或者你可以使用的功能在一些其他的方式來實現這一目標。

+0

謝謝。儘管我想保留下標語法,所以我只是做一些建議,並將表格保留爲空,這正是我所需要的。 – Virus721

0

在Lua中不存在不變性,你只是指索引訪問和分配。 Lua 5.3州...

這個事件發生在表格不是表格或表格不是 時。

......對於這兩種情況。

你最好的選擇是將值存儲在你的另一個表或子表中。

+0

感謝您的幫助。 – Virus721

+0

關於'__index'和'__newindex'元方法,Lua 5.1與Lua 5.3沒有區別。 –

+0

@EgorSkriptunoff謝謝你的提示,我會更新我的答案。 – Youka

相關問題