Class 卢阿接球手和二传手

Class 卢阿接球手和二传手,class,lua,setter,getter,codea,Class,Lua,Setter,Getter,Codea,我正在使用Codea iPad应用程序学习Lua。代码用于类。我试图实现的是一种为变量get和set方法指定函数的方法。目前,可以像这样访问变量“x”:print(obj.x),并使用如下代码设置:obj.x=1。我想让变量调用我可以指定的get和set函数。我正在移植一些用ActionScript3编写的东西,需要模拟A3的get和set函数声明。让我知道这是否可行,或者他们的方法是否不同。如果添加或修改代码是一种解决方案,我可以覆盖Codea的Class.lua。谢谢。您可以通过重写类上的u

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

您可以通过重写类上的uu newindex和u index方法来创建自定义setter和getter

注意,您必须修改LuaSandbox.lua,它是Codea的一部分,以启用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

你可以在这里找到更多关于元方法的信息:

那只需要一个谷歌就可以了……我已经看过上面的链接好几次了。我也认为这是解决方案,但我不知道如何指定特定变量的get和set函数。