你可以通过覆盖类的__newindex和__index方法,创建自定义的setter和getter。
请注意,您将需要修改Codea的一部分LuaSandbox.lua,以启用rawset和rawget方法(将设置它们为nil的行注释掉)。EDIT:在最新版本的Codea中,rawset和rawget默认可用。
当你试图在表格上设置一个尚未设置过的属性时,__newindex方法会被调用。
当您尝试获取表中不存在的属性时,__index方法会被调用。
因此,你可以通过在你的类中创建一个私有表,并将成员变量存储在其中,为getter和setter插入自定义代码。当你尝试读取和写入它们时,你可以在你的__newindex和__index方法中执行自定义代码。
MyClass = Class()
function MyClass:init()
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