Как использовать внешние файлы в качестве таблиц в Lua? - PullRequest
0 голосов
/ 31 декабря 2018

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

У меня есть файл с именем sword.lua в той же папке, что и программа, к которой я хочу получить доступ к ее информации.Он содержит

sword = {'sword', '10', '1', '100'}

Я пытаюсь получить доступ к информации, используя

wep = io.open("sword.lua", "r")
print(wep:read("*a"))
print(wep[1])

При первой печати возвращается весь текст в файле, который

"sword = {'sword', '10', '1', '100'}" 

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

1 Ответ

0 голосов
/ 01 января 2019

Чтобы загрузить таблицу из файла, используйте функцию require.Например, сохраните

return { 'sword', '10', '1', '100' }

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

С помощью приведенного выше решения IМожно также назначить локальную переменную, например,

local sword = require("sword")
print(table.concat(sword,", "))

Другое преимущество заключается в том, что вызовы require кэшируются, т.е. даже если вы require("sword") много раз, вы платите только за загрузку один раз.Но имейте в виду, что из-за кэширования вы всегда получаете указатель на одну и ту же таблицу, т. Е. Если вы изменяете таблицу, возвращаемую из require("sword"), эти изменения будут общими для всех экземпляров.

Пример наWandbox

...