當沒有鍵引用時,表有可能返回一個特定的值而不是自己的引用嗎?我可以重寫一個Lua表的返回值嗎?
比方說,我有如下表:
local person = {
name = "Kapulani",
level = 100,
age = 30,
}
在Lua中,我可以很容易地提及「person.name」,「person.level」,或「person.age」而獲得的值如預期。但是,在某些情況下,我可能只想引用「person」,而不是獲取「table:」,而是要返回「person.name」的值。
換句話說,我希望person.x(或person [x])從表中返回適當的條目,但沒有鍵的人可以返回person.name(或person [「name 「])。有沒有這種我無法找到的機制?
我對metatables沒有成功,因爲__index只適用於密鑰不存在的情況。如果我把「人」到一個單獨的表,我可以想出:
local true_person = {
... -- as above
}
local env_mt = {
__index = function(t, k)
if k == 'person' then
return true_person
end
end
}
local env = setmetatable({}, env_mt)
這讓我用__index做一些特殊處理,除了有我告訴沒有可辨別的方式,從__index()是否我得到env.person(我想要返回true_person.name)或env.person [key](我想要將true_person作爲表返回)的請求,以便'key'可以是適當訪問)。
有什麼想法?我可以用不同的方式來解決這個問題,但希望我可以按照這些方式來解決這個問題
您正在與Lua的語法作鬥爭,以創建您自己的DSL。它真的提供任何優勢嗎?一個例子會有所幫助。無論如何,你可以嘗試__call metamethod或簡單地將一個:default()方法添加到所有這些表中,並使用通用或特定於表的實現。 –
我絕對權衡利弊。我一直在玩** __電話**,儘管我希望避免使用**()**,但它與我所尋找的有點接近。我希望的優點是,通過限制現有語法和Lua語法之間的「翻譯」量,當Lua拋出錯誤時,輸出對用戶來說是相對有意義和可識別的。因此,將**&**轉換爲**和**以及** | **轉換爲**或**並不奇怪,但是在一些情況下將** **轉換爲** person()**當** person.name **不需要翻譯時,地方可能有點奇怪。 – Kapulani