Lua Getter和Setter [英] Lua getters and setters

查看:49
本文介绍了Lua Getter和Setter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Codea iPad应用程序并学习Lua。Codea使用Class.lua表示类。我试图实现的是一种为变量get和set方法指定函数的方法。目前,可以使用如下代码访问变量"x":print(obj.x)和set,代码如下:obj.x=1。我希望变量改为调用我可以指定的get和set函数。我正在移植用ActionScript3编写的东西,需要模仿A3的get和set函数声明。如果这是可能的,或者他们的是另一种方式,请告诉我。如果添加或更改Codea的代码是一种解决方案,我可以重写Codea的Class.lua。谢谢。

推荐答案

您可以通过重写类上的__newindex和__index方法来创建自定义setter和getter。

注意,您必须修改LuaSandbox.lua,它是Codea的一部分,以启用rawset和rawget方法(注释掉将它们设置为零的行)。编辑:最新版本的Codea不再是这样,默认提供rawsetrawget

每当您尝试在表上设置以前未设置的属性时,都会调用__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

这篇关于Lua Getter和Setter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆