Lua的获取器和设置器

我正在使用 Codea iPad 应用程序学习 Lua。Codea 使用 Class.lua 来进行类的定义。我想要实现的是:为变量的获取和设置方法指定函数。目前,像“x”这样的变量可以像这样访问:print(obj.x),并使用这样的代码进行设置:obj.x = 1。我想让变量调用我可以指定的获取和设置函数。我正在移植一个用 ActionScript 3 编写的程序,并需要模仿 A3 的获取和设置函数声明。如果可能的话,请告诉我是否可以实现,或者是否有其他方法。如果需要的话,我可以覆盖 Codea 的 Class.lua。谢谢。

原文链接 https://stackoverflow.com/questions/10578935

点赞
stackoverflow用户754400
stackoverflow用户754400

你可以通过覆盖你的类上的 __newindex__index 方法来创建自定义的 setter 和 getter。

需要注意的是,你必须修改 Codea 的一部分 LuaSandbox.lua 以启用 rawsetrawget 方法(注释掉将它们设置为 nil 的行)。 编辑:在最新版本的 Codea 中,rawsetrawget 默认可用。

__newindex 方法会在你尝试在之前未设置过的表属性上设置值时被调用。

__index 方法在你尝试获取表中不存在的属性时被调用。

因此,你可以通过在你的类中创建一个私有表并将你的成员变量存储在其中来插入自定义的 getters 和 setters。当你尝试读取和写入它们时,你可以在你的 __newindex__index 方法中执行自定义代码。

MyClass = Class()

function MyClass:init()
    -- 我们将在内部表中存储成员
    self.members = {}
end

function MyClass:__newindex(index, value)
    if index == "testMember" then
        self.members[index] = value
        print("设置成员" .. index .. "为" .. value)
    else
        rawset(self, index, value)
    end
end

function MyClass:__index(index)
    if index == "testMember" then
        print("获取" .. 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-14 11:05:00