Перейти к содержимому
  • 0
Oleshe

Объекты привязанные в цикле не привязываються.

Вопрос

Есть огрызок кода:

Скрытый текст

    for e, p in pairs(obj) do
      if obj.raw then -- Перед этим мы ставим raw. Предохранитель на то что всё пойдёт не так.
        if e == 'onTocuh' or e == 'type' or e == 'raw' or e == 'path' then -- Пропускаем. Содержат либо таблицы либо функций. Нежелательно их трогать.
        elseif e == 'mode' and obj.type == 'button' then -- Потом вынесем в отдельную функцию.
          obj.raw:remove()
          create(obj)
        elseif e == 'mode' then -- Потом вынесем в отдельную функцию. Тут вообще не тот параметр кст.
          obj.stage = 0
          obj:tick()
        elseif e == 'items' and obj.type == 'comboBox' then -- Потом вынесем в отдельную функцию.
          obj.raw:clear()
			    for j = 1,#obj.items do
			      local tmp = obj.raw:addItem(ocj.items[j].name,obj.items[j].active)
            tmp.path = obj.items[j].path
            tmp.index = j
            tmp.onTouch = function(tmp,tmp01)
              execute(tmp01.path,tmp.index,tmp01.index)
            end
			    end
        elseif e == 'colorbg' then
          obj.raw.colors.default.background = obj[e] -- Привязываем через =
        elseif e == 'colorbgp' and obj.type == 'input' then
          obj.raw.colors.focused.background = obj[e] -- Привязываем через =
        elseif e == 'colorbgp' then
          obj.raw.colors.pressed.background = obj[e] -- Привязываем через =
        elseif e == 'colorfg' or e == 'colort' then
          obj.raw.colors.default.text = obj[e] -- Привязываем через =
        elseif e == 'colorfgp' and obj.type == 'input' then -- Этот ..
          obj.raw.colors.focused.text = obj[e] -- Привязываем через =
        elseif e == 'colorfgp' then -- .. первее этого т.к. имя параметра объекта у них одинаковые, но параметры в raw разные.
          obj.raw.colors.pressed.text = obj[e] -- Привязываем через =
        elseif e == 'colorph' then
          obj.raw.colors.placeholderText = obj[e] -- Привязываем через =
        elseif e == 'colorv' then
          obj.raw.colors.value = obj[e] -- Привязываем через =
        elseif e == 'colora' then
          obj.raw.colors.arrow.text = obj[e] -- Привязываем через =
        elseif e == 'colorabg' then
          obj.raw.colors.arrow.background = obj[e] -- Привязываем через =
        elseif e == 'colorp' and obj.type == 'switch' or obj.type == 'slider' and e == 'colors' or obj.type == 'progressBar' and e == 'colorp' then
          obj.raw.colors.active = obj[e] -- Привязываем через =
        elseif (e == 'colors' and obj.type == 'switch' or obj.type == 'progressBar') or obj.type == 'slider' and e == 'colorpp' or obj.type == 'progressIndicator' and e == 'colorpa' then
          obj.raw.colors.passive = obj[e] -- Привязываем через =
        elseif e == 'colorpp' and obj.type == 'switch' or obj.type == 'slider' and e == 'colorp' then
          obj.raw.colors.pipe = obj[e] -- Привязываем через =
        elseif e == 'textph' then
            obj.raw.placeholderText = obj[e] -- Привязываем через =
        elseif obj.type == 'panel' then
            if e == 'color' then
              obj.raw.colors.background = obj[e] -- Привязываем через =
            end
        elseif obj.type == 'switch' then
            if e == 'state' then
              obj.raw:setState(obj[e]) -- Потом вынесем в отдельную функцию.
            end
        elseif obj.type == 'progressIdnicator' then
          if e == 'colorp' then
            obj.raw.colors.primary = obj[e] -- Привязываем через =
          elseif e == 'colorp' then
            obj.raw.colors.secondary = obj[e] -- Привязываем через =
          end
        else
          obj.raw[params[e] or e] = obj[e] -- Привязываем через = то что осталось. есть таблица параметров аля x = 'localX', если параметра в таблицуе нету, значит мы используем параметр буквку в букву.
        end
      end
    end

 

Как мы видим, оно должно привязывать параметры к их эквивалентам в raw. Но, когда мы изменяем параметр объекта, параметр raw-а остаётся тем-же.

Соответственно нужно что-бы если мы изменяли параметр объекта, мы изменяли его и в raw.

Аля:

local object = {}
local raw = {localX = -20}
object.raw = raw
object.x = 15
object.raw.localX = object.x
print(object.x,object.raw.localX) -- 15  15
object.x = 0
print(object.x,object.raw.localX) -- 0  0
object.localX = 20
print(object.x,object.raw.localX) -- 20  20

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

Изменено пользователем Oleshe

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

В 22.07.2023 в 00:44, Oleshe сказал:

object.raw.localX = object.x

 

Это не привязывает параметр localX к object.x.

Если можно вместо localX использовать x, то прибиндить можно так:

local object = {x = -20}
object.raw = object

object.x = 15
print(object.x,object.raw.x) -- 15  15
object.x = 0
print(object.x,object.raw.x) -- 0  0
object.raw.x = 20
print(object.x,object.raw.x) -- 20  20

Если разные имена нужны, придётся пользоваться метатаблицами.

local raw = {localX = -20}
local object = setmetatable({raw = raw}, {
  __index = function(self, k)
    assert(k == 'x')
    return raw.localX
  end,
  __newindex = function(self, k, v)
    assert(k == 'x')
    raw.localX = v
  end
})

object.x = 15
print(object.x,object.raw.localX) -- 15  15
object.x = 0
print(object.x,object.raw.localX) -- 0  0
object.raw.localX = 20
print(object.x,object.raw.localX) -- 20  20

Но вообще, стоило бы лучше продумать архитектуру кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...