Lua的获取器和设置器

9
我正在使用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文件,添加或修改其中的代码。谢谢。

实现Lua中正确的Getter/Setter。这个链接只需要谷歌一下就可以找到。 - PeterMmm
我已经多次查看了上面的链接。我也认为那是解决方案,但我无法弄清楚如何指定特定变量的get和set函数。 - Spencer
1个回答

11
你可以通过覆盖类的__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()
    -- 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接