【问题标题】:Lua getters and settersLua getter 和 setter
【发布时间】:2012-05-14 07:14:27
【问题描述】:

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

【问题讨论】:

  • nova-fusion.com/2011/04/04/… 那只有一个 google 距离...
  • 我已经多次查看上面的链接。我也认为这是解决方案,但我不知道如何指定特定变量的 get 和 set 函数。

标签: class lua setter getter codea


【解决方案1】:

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

请注意,您必须修改 LuaSandbox.lua,它是 Codea 的一部分,以启用 rawset 和 rawget 方法(注释掉将它们设置为 nil 的行)。 编辑:在最新版本的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 2016-02-24
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多