Луа добытчики и сеттеры

Я работаю с приложением Codea для iPad и изучаю Lua. Codea использует Class.lua для классов. То, что я пытаюсь достичь, - это способ указать функции для переменных, получить и установить методы. В настоящее время доступ к переменной "x" можно получить следующим образом: print(obj.x) и установить с помощью кода, подобного следующему: obj.x = 1. Я бы хотел, чтобы переменная вместо этого вызывала функцию get и set, которую я могу указать, Я портирую что-то написанное в Actionscript 3, и мне нужно имитировать объявления функций get и set A3. Дайте мне знать, если это возможно, или если это другой путь. Я могу переопределить Class.lua Codea, если добавление или изменение его кода является решением. Благодарю.

1 ответ

Решение

Вы можете создать собственный установщик и получатель, переопределив методы __newindex и __index в своем классе.

Обратите внимание, что вам придется изменить LuaSandbox.lua, который является частью Codea, чтобы включить методы rawset и rawget (закомментируйте строки, установив их равными nil). РЕДАКТИРОВАТЬ: Это больше не относится к последней версии Codea, rawset а также rawget доступны по умолчанию.

Метод __newindex вызывается всякий раз, когда вы пытаетесь установить свойство для таблицы, которое не было установлено ранее.

Метод __index вызывается всякий раз, когда вы пытаетесь получить свойство, которого нет в таблице.

Таким образом, вы можете вставить собственный код для методов получения и установки, создав личную таблицу в своем классе и сохранив там свои переменные-члены. Когда вы пытаетесь читать и записывать их, вы можете выполнить собственный код в ваших методах __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

Другие вопросы по тегам