Lua: Передача индекса вложенных таблиц в качестве аргументов функции?

Возможно ли иметь функцию, которая может обращаться к произвольно вложенным записям таблицы? Следующий пример предназначен только для одной таблицы. Но в моем реальном приложении мне нужна функция для проверки нескольких разных таблиц на заданный (вложенный) индекс.

local table1 = {
  value1 = "test1",
  subtable1 = {
    subvalue1 = "subvalue1",
  },
}

local function myAccess(index)
  return table1[index]
end

-- This is fine:
print (myAccess("value1"))

-- But how do I access subtable1.subvalue1?
print (myAccess("subtable1.subvalue1???"))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
0
140
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не сможете сделать это с помощью строки, если только не воспользуетесь load для обработки ее как кода Lua или не создадите функцию для перемещения по столу.

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

Вы можете сделать это, используя gmatch + один локальный над gmatch с текущей таблицей.

Аргумент не обязательно должен быть строкой, если есть другой способ? Как работает "один за другим"?

Linus 21.12.2020 00:45

@Линус, хорошо, если ты можешь сделать это в сценарии, просто сделай table1.subtable1.subvalue1, если он никогда не изменится. один за другим выполняется gmatch, потому что он будет вызываться для каждого ключа. for key in string.gmatch(index, "[^.]+") do print(key) end

Spar 21.12.2020 00:52

Моя функция должна проверять, существует ли table1.subtable1.subvalue1, и если нет, она должна возвращать table2.subtable1.subvalue1. Поэтому я должен сказать своей функции, что она должна проверять subtable1.subvalue1.

Linus 21.12.2020 01:00

сделайте локальный перед gmatch для table1, используйте ключи gmatch и перейдите к следующей таблице. проверить, если это ноль.

Spar 21.12.2020 01:11

Я опубликовал другой ответ. Это то, что вы предлагали?

Linus 21.12.2020 01:15

@Linus Да, ты понял, ты помечаешь мой ответ как «Принятый»

Spar 21.12.2020 01:17

@Spar: Это то, что вы предлагали? Все равно работает, так что спасибо!

local table1 = {
  value1 = "test1",
  subtable1 = {
    subvalue1 = "subvalue1",
  },
}


local function myAccess(index)
  
  local returnValue = table1
  for key in string.gmatch(index, "[^.]+") do 
    if returnValue[key] then
      returnValue = returnValue[key]
    else
      return nil
    end
  end
  
  return returnValue
end

-- This is fine:
print (myAccess("value1"))

-- So is this:
print (myAccess("subtable1.subvalue1"))

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