我正在使用Codea iPad應用程序並學習Lua。 Codea使用Class.lua作爲類。我想要實現的是一種爲變量get和set方法指定函數的方法。目前,變量say「x」可以這樣訪問:print(obj.x)並用這樣的代碼設置:obj.x = 1.我想讓變量調用get和set函數,我可以指定。我正在移植使用Actionscript 3編寫的東西,並且需要模仿A3的get和set函數聲明。讓我知道如果這是可能的或者如果他們是另一種方式。如果添加或更改代碼是解決方案,我可以重寫Codea的Class.lua。謝謝。Lua獲取者和設置者
5
A
回答
5
您可以通過覆蓋類中的__newindex和__index方法來創建自定義setter和getter。
請注意,您必須修改Codea的一部分LuaSandbox.lua,以啓用rawset和rawget方法(將註釋設置爲零的行註釋掉)。 編輯:在Codea的最新版本中不再是這種情況,默認情況下可以使用rawset
和rawget
。
只要您嘗試設置表中以前未設置的屬性,就會調用__newindex方法。
只要您嘗試獲取表中不存在的屬性,就會調用__index方法。
所以你可以通過在你的類中創建一個私有表並在其中存儲你的成員變量來爲getter和setter插入自定義代碼。當您嘗試讀取和寫入它們時,您可以在__newindex和__index方法中執行自定義代碼。
MyClass = Class()
function MyClass:init()
-- We'll store members in an internal table
self.members = {}
end
function MyClass:__newindex(index, value)
if index == "testMember" then
self.members[index] = value
print("Set member " .. index .. " to " .. value)
else
rawset(self, index, value)
end
end
function MyClass:__index(index)
if index == "testMember" then
print("Getting " .. index)
return self.members[index]
else
return rawget(self, index)
end
end
爲了測試它
function setup()
foo = MyClass()
foo.testMember = 5
foo.testMember = 2
print(foo.testMember)
end
您可以找到有關元方法在這裏的更多信息:http://lua-users.org/wiki/MetamethodsTutorial
相關問題
- 1. 記錄獲取者和設置者
- 2. ExtJS模型獲取者和設置者
- 3. 無法在Swift中設置獲取者和設置者
- 4. Python的獲取者/設置者
- 5. 獲得者,設置者和循環
- 6. 自定義類的獲取者和設置者
- 7. 父類中的獲取者和設置者
- 8. slick 2d,Java,動畫獲取者和設置者
- 9. 確定有效的獲取者和設置者
- 10. NodeJs MongoDb沒有獲取者和設置者的結果
- 11. Laravel - 爲獲取者和創建者設置3個函數
- 12. 獲取者和設置者的首選Qt風格
- 13. 主義覆蓋關係字段的獲取者和設置者
- 14. 擴展現有實體以覆蓋獲取者和設置者
- 15. Luabind屬性獲取者和設置者可以產生?
- 16. 覆蓋子類的所有設置者和獲取者
- 17. 抽象類與抽象獲取者和設置者
- 18. Android開發者:避免內部獲取者/設置者?
- 19. 同步屬性獲得者/設置者
- 20. 重寫繼承的獲取者/設置者
- 21. EntityFramework Code首先對屬性獲取者/設置者做什麼?
- 22. Haxe到SWC - 受保護的獲取者/設置者
- 23. 防止爲@Transient字段生成獲取者/設置者
- 24. 注入/處理屬性獲取者/設置者?
- 25. 具有地圖的類的獲取者/設置者
- 26. c中的獲取者和安裝者#
- 27. 受益於Play中產生的獲取者和設置者!框架
- 28. 在目標C中重構顯式獲取者和設置者C
- 29. 關於JavaBean屬性的命名,關於獲取者和設置者
- 30. 在Eclipse中自動生成的獲取者/設置者之間放置空間
http://nova-fusion.com/2011/04/04/implementing-proper- gettersetters-in-lua /那只有一個谷歌... – PeterMmm
我已經看了上面的鏈接幾次。我也認爲這是解決方案,但我無法弄清楚如何指定特定變量的get和set函數。 – Spencer