Использование нескольких переменных для ссылки на поле Sub-Sub-Sub в словаре Lua - PullRequest
2 голосов
/ 30 сентября 2019
  1. Я новичок в Lua (например, вчера новый), поэтому, пожалуйста, потерпите меня ...
  2. Я прошу прощения за запутанный характер этого вопроса, но у меня не было лучшего представления окак продемонстрировать то, что я пытаюсь сделать:

У меня есть таблица Lua, используемая в качестве словаря. Кортежи (?) Не нумеруются, но в основном используют строковые индексы. Многие из индексов на самом деле относятся к подстолям, которые содержат более подробную информацию, а некоторые из индексов в этих таблицах относятся к еще большему количеству таблиц - некоторые из них имеют три или четыре "уровня" глубины.

Мне нужносоздать функцию, которая может искать конкретное описание элемента по нескольким «уровням» в структуре словаря, не зная заранее, какие ключи / субключи / субподключения привели меня к нему. Я пытался сделать это с помощью переменных и циклов for, но столкнулся с проблемой, когда два ключа в строке динамически тестируются с использованием этих переменных.

В приведенном ниже примере я пытаюсьполучить значение:

myWarehouselist.Warehouse_North.departments.department_one["rjXO./SS"].item_description

Но так как я не знаю заранее, что я смотрю в "Warehouse_North" или в "Department_one", я бегу через этиальтернативы, использующие переменные, ищущие конкретный идентификатор элемента "rjXO./SS" и, таким образом, ссылка на это значение в конечном итоге выглядит следующим образом:

myWarehouseList[warehouse_key].departments[department_key][myItemID]...?

По сути, проблема Iу меня есть, когда мне нужно поместить две переменные в цепочку ссылок значения, хранящегося на уровне N словаря. Я не могу написать это как [x] [y], или как [x [y]], или как [xy], или как [x]. [Y] ... Я понимаю, что в Lua, xyэто не то же самое, что x [y] (первый напрямую ссылается на ключ по строковому индексу "y", а второй использует значение, хранящееся в переменной "y", которая может быть чем угодно.)

IЯ пробовал много разных способов и только получил ошибки.

Что интересно, если я использую точно такой же подход, но добавляю дополнительный «уровень» в словарь с постоянным значением, например [«items»] (под каждым конкретным отделом), это позволяет мнечтобы ссылаться на значение без проблем, и мой скрипт работает нормально ...

myWarehouseList[warehouse_key].departments[department_key].items[item_key].item_description

Так должен выглядеть синтаксис Lua? Я изменил структуру таблицы, чтобы включить дополнительный слой «предметов» в каждом отделе, но он кажется излишним и ненужным. Есть ли синтаксическое изменение, которое я могу сделать, чтобы позволить мне использовать две переменные в цепочке ссылок на значения таблицы Lua?

Заранее спасибо за любую помощь!

    myWarehouseList = {
        ["Warehouse_North"] = {
             ["description"] = "The northern warehouse"
            ,["departments"] = {
                 ["department_one"] = {
                     ["rjXO./SS"] = {
                         ["item_description"] = "A description of item 'rjXO./SS'"
                     }
                 }
            }
        }
       ,["Warehouse_South"] = {
             ["description"] = "The southern warehouse"
            ,["departments"] = {
                 ["department_one"] = {
                     ["rjXO./SX"] = {
                         ["item_description"] = "A description of item 'rjXO./SX'"
                     }
                 }
            }
       }
    }

    function get_item_description(item_id)
        myItemID = item_id
        for warehouse_key, warehouse_value in pairs(myWarehouseList) do
            for department_key, department_value in pairs(myWarehouseList[warehouse_key].departments) do
                for item_key, item_value in pairs(myWarehouseList[warehouse_key].departments[department_key]) do 
                    if item_key == myItemID
                    then
                        print(myWarehouseList[warehouse_key].departments[department_key]...?)
                        -- [department_key[item_key]].item_description?
                        -- If I had another level above "department_X", with a constant key, I could do it like this:
                        -- print(
                        --  "\n\t" .. "Item ID " .. item_key .. " was found in warehouse '" .. warehouse_key .. "'" ..
                        --  "\n\t" .. "In the department: '" .. dapartment_key .. "'" ..
                        --  "\n\t" .. "With the description: '" .. myWarehouseList[warehouse_key].departments[department_key].items[item_key].item_description .. "'")
                        -- but without that extra, constant "level", I can't figure it out :)
                    else
                    end
                end
            end
        end
    end

1 Ответ

1 голос
/ 30 сентября 2019

Если вы в полной мере используете свои циклические переменные, вам не нужны эти длинные цепочки индексов. Похоже, вы полагаетесь только на ключевые переменные, но на самом деле именно переменные-значения содержат большую часть необходимой вам информации:

function get_item_description(item_id)
  for warehouse_key, warehouse_value in pairs(myWarehouseList) do
    for department_key, department_value in pairs(warehouse_value.departments) do
      for item_key, item_value in pairs(department_value) do 
        if item_key == item_id then
          print(warehouse_key, department_key, item_value.item_description)
        end
      end
    end
  end
end

get_item_description'rjXO./SS'
get_item_description'rjXO./SX'
...