Луа, как требуют работы - PullRequest
       17

Луа, как требуют работы

9 голосов
/ 01 августа 2011

Я использую графическую библиотеку, которая позволяет программировать на Lua. Мне нужна библиотека A * pathfinding, поэтому я нашел ее в Интернете. Это просто 1 файл lua, который выполняет поиск пути, и 1 файл примера. В файле примера он использует объект как:

-- Loading the library
local Astar = require 'Astar'
Astar(map,1) -- Inits the library, sets the OBST_VALUE to 1

Я запускаю скрипт и все работает. Поэтому теперь я добавляю файл Astar.lua в путь, где работает мой графический движок, и делаю то же самое, и я получаю сообщение об ошибке в строке Astar (map, 1):

"попытка вызвать местный" Астар "(числовое значение)

Любые идеи, почему я получаю эту ошибку, когда я делаю то же самое, что и пример, который идет с этой библиотекой AStar?

Вот немного файла AStar

-- The Astar class
local Astar = {}
setmetatable(Astar, {__call = function(self,...) return self:init(...) end})
Astar.__index = Astar

-- Loads the map, sets the unwalkable value, inits pathfinding
function Astar:init(map,obstvalue)
    self.map = map
        self.OBST_VALUE = obstvalue or 1
    self.cList = {}
    self.oList = {}
    self.initialNode = false
    self.finalNode = false
    self.currentNode = false
    self.path = {}
    self.mapSizeX = #self.map[1]
    self.mapSizeY = #self.map
end

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

Ответы [ 2 ]

11 голосов
/ 21 августа 2011

Как Astar добавляется в таблицу package.loaded для примера сценария, в отличие от вашего кода?

ОБЗОР СИНТАКТИЧЕСКОГО САХАРА QUICK LUA:

  • func 'string' эквивалентно func('string')
  • tabl.ident эквивалентно tabl['ident']

Когда вы запускаете скрипт, используя require('Astar'), он делает следующее:

  • проверяет, является ли package.loaded['Astar'] ненулевым значением.
    • Если это так, он возвращает это значение. В противном случае он продолжает вниз по этому списку.
  • Запускает имена файлов шаблонов, перечисленных в package.pathpackage.cpath), с '?' заменяется на 'Astar', пока не найдет первый файл, соответствующий шаблону.
  • Устанавливает package.loaded['Astar'] в true.
  • Запускает скрипт модуля (найденный с помощью поиска пути выше - для примера мы предположим, что это не модуль C) с 'Astar' в качестве аргумента (доступный как ... в скрипте модуля).
  • Если скрипт возвращает значение, это значение помещается в package.loaded['Astar'].
  • Содержимое package.loaded['Astar'] возвращается.
    • Обратите внимание, что скрипт может загрузить пакет в package.loaded['Astar'] как часть своего выполнения и ничего не возвращать.

Как кто-то заметил в комментариях выше, ваша проблема может быть связана с загрузкой модуля с использованием «A S tar» вместо «A s tar». Возможно, что Lua загружает этот сценарий с помощью этой строки (поскольку в Windows без учета регистра поиск файла с именем «AStar.lua» откроет файл с именем «Astar.lua»), но сценарий не работать с этим (используя жестко закодированный "Astar" вместо "AStar" Lua загружает скрипт в).

5 голосов
/ 02 августа 2011

Вам нужно добавить return Astar в конце Astar.lua.

...