Как преобразовать строку в имя переменной?

#lua

#lua

Вопрос:

В принципе, у меня есть что-то вроде приведенного ниже.. Обратная связь от пользователя представлена в виде строки. «CONST_ME_NONE»

Есть ли какой-либо способ преобразовать «CONST_ME_NONE» в имя переменной CONST_ME_NONE?

 local CONST_ME_NONE = 0
local CONST_ME_DRAWBLOOD = 17
local CONST_ME_LOSEENERGY = 24

local effects = {CONST_ME_NONE, CONST_ME_DRAWBLOOD, CONST_ME_LOSEENERGY}

local user_input = "CONST_ME_NONE"
user_input = -- do something to convert string to variable name

for i = 1, #effects do
    if effects[i] == user_input then
        -- do something
        break
    end
end
  

Комментарии:

1. Если это локальные переменные, почему бы вместо них не использовать таблицу значений, привязанную к этим строкам, для хранения значений?

2. @Nifim Я предполагаю, что ответ на мой вопрос «не будь ленивым» lmao, я просто действительно не хотел делать таблицу слишком большой, поскольку там около 200 локальных файлов — но просто для ясности, ты это имеешь в виду? local effects = { "CONST_ME_NONE" = CONST_ME_NONE, "CONST_ME_DRAWBLOOD" = CONST_ME_DRAWBLOOD, "CONST_ME_LOSEENERGY" = CONST_ME_LOSEENERGY }

3. ответ Лютера — это то, что я имел в виду. это для того, чтобы «правильно» обрабатывать подобные вещи.

Ответ №1:

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

 local effects = {
  CONST_ME_NONE = 0,
  CONST_ME_DRAWBLOOD = 17,
  CONST_ME_LOSEENERGY = 24,
}

local user_input = "CONST_ME_NONE"

if effects[user_input] ~= nil then
  -- do something
end
  

Ответ №2:

вы можете преобразовать строку с именем переменной в реальную переменную с помощью load() :

load("return string")

пример:

print(variable)

eh равно:

print(load("return variable")())

в вашем случае вместо

if effects[i] == user_input then

используйте:

if effects[i] == load("return user_input")() then

вы также можете проверить, работает ли метод с print:

print(load("return user_input")())

Комментарии:

1. pastebin.com/raw/tMwG7mPb Я пробовал это, но он никогда не находит значение при использовании, load(user_input) если я использую load(user_input)() , я получаю ошибку input:11: attempt to call a nil value

2. @Xikini извините, я забыл return xD, теперь это правильно!

3. Я чувствую себя дураком, поскольку понятия не имею, почему это не работает. xD Я тестирую это здесь lua.org/cgi-bin/demo , но print(load("return user_input")()) возвращает nil

4. @Xikini pastebin.com/raw/yFWsBqpQ у меня это работает, попробуйте удалить local