Как заставить функцию выполняться, если свойство объекта изменено в LUA? - PullRequest
0 голосов
/ 01 августа 2020

Итак, я хочу, чтобы функция использовалась после обнаружения изменения свойства. Как мне это сделать

1 Ответ

0 голосов
/ 02 августа 2020

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

Если вам нужно соблюдать свойства вложенной таблицы , вы должны создать рекурсивную прокси-таблицу и динамически ее изменить.

<script src="https://cdn.jsdelivr.net/npm/fengari-web@0.1.4/dist/fengari-web.js"></script>

<script type="application/lua">

function observable(data, callback)
  return setmetatable({}, {
    __index = data,
    __newindex = function(self, n, v)
      local oldv = data[n]
      if v ~= oldv then
        data[n] = v
        callback(n, v, oldv)
      end
    end
  })
end


local my_object = { test1 = 'value1' }
my_object = observable(my_object,
  function(key,value,oldvalue)
    print('key='..key
          ..', value='..tostring(value)
          ..', oldvalue='..tostring(oldvalue))
    end)

my_object.test1 = 1
my_object.test2 = 2
my_object.test1 = 'othervalue'
my_object.test2 = nil

</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...