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

Почему package.lua не видит модуль?

Вопрос

Всем привет! Пытаюсь сделать так, чтобы программа использовала функции в модуле из папки вне корневой папки Майнкрафт-а, а из папки, допустим, D:/23 Вот код основной, вызывающей модуль программы:

local printermodule = require("printermodule")
printermodule.pr()

Вот модуль:

printermodule = {}

function printermodule.pr()
  print("hello")
end
return printermodule

В package.lua, что в папке lib папки жесткого диска робота, добавил конце строку "/D:/23/?.lua". Пытался и без слеша "D:/23/?.lua", но в этом случае ищет в "home/D:/23/?.lua":

package.path = "/lib/?.lua;/usr/lib/?.lua;/home/lib/?.lua;./?.lua;/lib/?/init.lua;/usr/lib/?/init.lua;/home/lib/?/init.lua;./?/init.lua;/D:/23/?.lua"

Скрин ошибки прикрепил.

2.jpg

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


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

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

28 минут назад, WheatComp сказал:

как получить доступ через средства индексации и цикла?

Это как? Перебирать ключи одной таблицы и по ним получать значения вложенных таблиц?

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


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

@eu_tomat да, потому что этот метод можно применить и к другим вложенным таблицам.

7 минут назад, eu_tomat сказал:

значения вложенных таблиц

значения переменных вложенных таблиц, я бы сказал (capacity).

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


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, WheatComp сказал:

значения переменных вложенных таблиц, я бы сказал (capacity).

Итератор pairs последовательно выдаёт пары ключ-значение заданной таблицы. Вложенные таблицы он не обходит. Можно, конечно, эти ключи применить и к вложенным таблицам тоже, но смысла в этом обычно не много, т.к. ключи таблиц не обязаны совпадать.

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


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, WheatComp сказал:

tank1 = {amount = 222, capacity = 333}
tank2 = {amount = 452, capacity = 349}
tankTable = {tank1, tank2}

for key, value in pairs(tankTable) do
print(value)
print(tankTable[1][key])
end

Выводит nil nil.

tank1 = {amount = 222, capacity = 333}
tank2 = {amount = 452, capacity = 349}
tankTable = {tank1, tank2}

-- Сначала перебираем танки
for tankIndex, tank in ipairs(tanksTable) do
  -- Затем все поля танка
  for key, value in pairs(tank) do
    print(key, value)
  end
end

 

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


Ссылка на сообщение
Поделиться на других сайтах
5 минут назад, WheatComp сказал:

@ECS Выдает ошибку:

Там банальная опечатка внутри ipairs: вместо tanksTable должен быть tankTable.

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


Ссылка на сообщение
Поделиться на других сайтах
42 минуты назад, WheatComp сказал:

Выдает ошибку:

Символ "s" поставил лишний, сорян. Я тебе сам принцип хотел показать, что нужно сначала пройтись по всем имеющимся танкам, а затем уже обращаться к их полям.

 

Если нужен самодельный сериализатор для любого типа таблиц, то можно написать что-то вроде

tank1 = {amount = 222, capacity = 333, nestedTable = {1, 2, 3}}
tank2 = {amount = 452, capacity = 349, nestedTable = {4, 5, 6}}
tankTable = {tank1, tank2}

local function printTableContents(source, name, indentator)
  indentator = indentator or ""
  name = name or ""

  print(indentator .. name .. "{")

  for key, value in pairs(source) do
  	if type(value) == "table" then
    	printTableContents(value, tostring(key) .. " = ", (indentator or "") .. "  ")
    else
    	print(indentator .. "  " .. tostring(key) .. " = " .. tostring(value))
    end
  end

  print(indentator .. "}")
end

printTableContents(tankTable)

В результате выведется

 

image.png.0ced26fb63264a0cad788e7fd31c338b.png

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


Ссылка на сообщение
Поделиться на других сайтах
48 минут назад, ECS сказал:

tank1 = {amount = 222, capacity = 333}
tank2 = {amount = 452, capacity = 349}
tankTable = {tank1, tank2}

-- Сначала перебираем танки
for tankIndex, tank in ipairs(tanksTable) do
  -- Затем все поля танка
  for key, value in pairs(tank) do
    print(key, value)
  end
end

 

Открываем вложенную таблицу вложенным циклом - изящно! Если можно все-таки получить доступ к значению "amount" посредством по сути цифрой (коей является индекс), то как это можно выразить в одной строчке print()-а, используя только цифры? Типа tankTable[1][1]?

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


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, WheatComp сказал:

то как это можно выразить в одной строчке print()-а, используя только цифры? Типа tankTable[1][1]

tankTable[1].amount

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, ECS сказал:

tankTable[1].amount

amount - это не цифра

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


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, WheatComp сказал:

amount - это не цифра

Согласен, это буквы. Тем не менее, чтобы выразить доступ к "amount" в одном вызове print'а, необходимо использовать именно такую языковую конструкцию:

 

image.png.4b941e6f8e67352f50101e6852dfd2f3.png

 

Вызов по численному индексу невозможен, amount в этом случае не имеет численной замены для доступа к значению. Поэтому только буковки

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


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

Как же тогда тут удалось обойтись без .amount?:

1 час назад, ECS сказал:

-- Сначала перебираем танки
for tankIndex, tank in ipairs(tanksTable) do
  -- Затем все поля танка
  for key, value in pairs(tank) do
    print(key, value)
  end
end

 

 

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


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, WheatComp сказал:

Если можно все-таки получить доступ к значению "amount" посредством по сути цифрой (коей является индекс), то как это можно выразить в одной строчке print()-а, используя только цифры? Типа tankTable[1][1]?

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

 

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

1 час назад, ECS сказал:

Если нужен самодельный сериализатор для любого типа таблиц, то можно написать что-то вроде

 

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, WheatComp сказал:

Как же тогда тут удалось обойтись без .amount?:

Функция pairs возвращает итератор, который проходит по всем элементам таблицы tankTable, позволяя обработать их ключ и значение. Amount является ключом, причём строковым

 

Иными словами, чтобы "обойтись" без .amount, нужно перебрать все элементы таблицы, что лишено практического смысла из соображений производительности

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


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, ECS сказал:

Функция pairs возвращает итератор, который проходит по всем элементам таблицы tankTable,

Итератор, возвращаемый функцией pairs, это же цифра? Он же нумерует элементы таблицы? Если pairs может обратиться к аmount "по цифре", то почему мы не можем? Или я, может, путаю ключ с переменной? Если бы amount был переменной, выражение print(tankTable[1][1]) было бы корректным и напечаталась бы цифра 222. Может, ключ не так работает?

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


Ссылка на сообщение
Поделиться на других сайтах
49 минут назад, WheatComp сказал:

Итератор, возвращаемый функцией pairs, это же цифра? Он же нумерует элементы таблицы?

Итератор возвращает пары ключ-значение таблицы. Если ключ имеет числовой тип, будет возвращено число. Если же ключ является строкой "amount", то и будет возвращена стока "amount". Никакой нумерации итератор не добавляет.

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


Ссылка на сообщение
Поделиться на других сайтах
20 часов назад, eu_tomat сказал:

Если ключ имеет числовой тип, будет возвращено число. Если же ключ является строкой "amount", то и будет возвращена стока "amount". Никакой нумерации итератор не добавляет.

Вот как ключ работает! Спасибо.

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


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

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

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

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

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

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

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

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

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


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