Lua中如何实现一个类的getter和setter方法?
- 内容介绍
- 文章标签
- 相关推荐
本文共计438个文字,预计阅读时间需要2分钟。
我正在使用Codea和iPad应用程序学习Lua编程。Codea中使用Class.lua进行课程学习。我想实现的是一种为变量定义get和set方法指定函数的方法。目前,一个名为x的变量可以像这样访问:print(obj.x)。
我正在使用Codea iPad应用程序并学习Lua. Codea使用 Class.lua进行课程.我想要实现的是一种为变量get和set方法指定函数的方法.目前,一个变量说“x”可以像这样访问:print(obj.x)并使用如下代码设置:obj.x = 1.我希望变量改为调用我可以指定的get和set函数.我正在移植用Actionscript 3编写的东西,需要模仿A3的get和set函数声明.如果这是可能的,或者如果它们是另一种方式,请告诉我.如果添加或更改其代码是一个解决方案,我可以覆盖Codea的Class.lua.谢谢. 您可以通过覆盖类上的__newindex和__index方法来创建自定义setter和getter.请注意,您必须修改作为Codea一部分的LuaSandbox.lua,以启用rawset和rawget方法(注释掉将它们设置为nil的行).编辑:在最新版本的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
您可以在此处找到有关metamethods的更多信息:lua-users.org/wiki/MetamethodsTutorial
本文共计438个文字,预计阅读时间需要2分钟。
我正在使用Codea和iPad应用程序学习Lua编程。Codea中使用Class.lua进行课程学习。我想实现的是一种为变量定义get和set方法指定函数的方法。目前,一个名为x的变量可以像这样访问:print(obj.x)。
我正在使用Codea iPad应用程序并学习Lua. Codea使用 Class.lua进行课程.我想要实现的是一种为变量get和set方法指定函数的方法.目前,一个变量说“x”可以像这样访问:print(obj.x)并使用如下代码设置:obj.x = 1.我希望变量改为调用我可以指定的get和set函数.我正在移植用Actionscript 3编写的东西,需要模仿A3的get和set函数声明.如果这是可能的,或者如果它们是另一种方式,请告诉我.如果添加或更改其代码是一个解决方案,我可以覆盖Codea的Class.lua.谢谢. 您可以通过覆盖类上的__newindex和__index方法来创建自定义setter和getter.请注意,您必须修改作为Codea一部分的LuaSandbox.lua,以启用rawset和rawget方法(注释掉将它们设置为nil的行).编辑:在最新版本的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
您可以在此处找到有关metamethods的更多信息:lua-users.org/wiki/MetamethodsTutorial

