7

我正在使用 Codea iPad 应用程序并学习 Lua。Codea 使用Class.lua作为类。我想要实现的是一种为变量获取和设置方法指定函数的方法。目前,可以像这样访问变量“x”:print(obj.x) 并使用如下代码设置:obj.x = 1。我希望该变量改为调用我可以指定的 get 和 set 函数. 我正在移植用 Actionscript 3 编写的东西,需要模仿 A3 的 get 和 set 函数声明。让我知道这是否可能,或者他们是否是另一种方式。如果添加或更改代码是一种解决方案,我可以覆盖 Codea 的 Class.lua。谢谢。

4

1 回答 1

10

您可以通过覆盖类上的 __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

您可以在此处找到有关元方法的更多信息:http: //lua-users.org/wiki/MetamethodsTutorial

于 2012-05-14T11:05:00.047 回答