Луа добытчики и сеттеры
Я работаю с приложением 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