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???"))
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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"))

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