Перейти к содержимому
  • 0
chanmagomed

Задачка из учебника Lua

Вопрос

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

Задачка после первой же главы "Упражнение 1.5. Напишите простой скрипт, который печатает свое имя, не зная его заранее." - не вызвала никаких проблем... по крайней мере, пока я не начал её решать. 

Пишу в print(arg[0]) - по идее тут должно храниться имя скрипта  >> выдаёт ошибку, мол arg  - нилл валуе.

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

Есть ли замена этому в OC? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Код верен, действительно. Проблема вот в чём. Таблицу arg добавляет стэндалонный интерпретатор. А в OpenOS не озаботились этим.

Но есть другой способ. Путь к программе хранится в переменной окружения _. Получается она вызовом os.getenv("_"). Выдаст что-то вроде /bin/lua.lua.

 

К слову, другие аргументы можно получить через .... Это варарг-выражение, которое должно быть описано где-то дальше в учебнике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Насчет вашего вопроса. Немного не ясно при помощи чего вы пытаетесь получить имя. Есть 2 пути.

Самый простой это io.read()

a = io.read()

print('Hello '..a)
Скрытый текст

Screenshot_2019-07-02-08-04-22-885_com.q

Как видите сработало.

Почему у вас ругается? Так вы пытаетесь использовать массивы. Необходимо сначала сказать переменной что она массив

arg ={}

arg[1] = io.read()

print(arg[1])

Рекомендую отсчет начинать с 1 у нас же не java хотя это уже дело каждого хоть с -100 можно начать.

Таким образом все прекрасно сработает.

Второй способ более сложный, связан с event нажатием на экран и выводом полученных данных. Рассказывать его не буду, после изучения массивов, циклов и api майна все сами поймете. А не поймете, пишите и вам подскажут.

Изменено пользователем Asior
Код, картинка, спойлер

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, вы в курсе что в OC есть 2 варианта написания программы?

Через edit <fileName.lua> тогда откроется редактор для вашего кода где можно написать, сохранить и позже выполнить его.

И через lua тогда откроется консоль в которой можно вводить команды и сразу получать готовый результат, ну как у меня на скрине. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это совсем легаси метода. Вроде-бы перестала работать с версии 5.0.

 

Почти всю информацию о процессе можно получить из debug.

Имя файла и весь путь можно добыть через debug.getinfo(1).source

Все дерево можно проследить по нечетным индексам

for i = 1, math.huge, 2 do
  s = debug.getinfo(i)
  if s then
    print(s.source)
  else
    break
  end
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Эмулятор поставлю обязательно

Изменено пользователем chanmagomed

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...