开发者

lua how require works

I'm using a graphics library that lets you program in Lua. I have a need for the A* pathfinding library so I found one online. It's just 1 lua file that does the pathfinding and 1 example file. In the example file it uses the object like:

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

I run the script and everything works. So now I add the Astar.lua file to the path location where my graphics engine is running and do the same thing and I get the error on the Astar(map, 1) line:

"attempt to call local 'AStar' (a number value)

Any ideas why I would be getting that error when I'm doing the same thing as the example that comes with this AStar lib?

Here is a little of the AStar file

-- 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

So note that when I run this from my graphics engine it's returning 1, but when run from the example that i开发者_JS百科t came with it's returning a table, which is what it should be returning. So not sure why it would only be returning 1.


How is Astar getting added to the package.loaded table for the example script, as opposed to your code?

QUICK LUA SYNTACTIC SUGAR REVIEW:

  • func 'string' is equivalent to func('string')
  • tabl.ident is equivalent to tabl['ident']

When you run a script using require('Astar'), this is what it does:

  • checks if package.loaded['Astar'] is a non-nil value.
    • If it is, it returns this value. Otherwise it continues down this list.
  • Runs through filenames of the patterns listed in package.path (and package.cpath), with '?' replaced with 'Astar', until it finds the first file matching the pattern.
  • Sets package.loaded['Astar'] to true.
  • Runs the module script (found via path search above- for the sake of this example we'll assume it's not a C module) with 'Astar' as an argument (accessible as ... in the module script).
  • If the script returns a value, this value is placed into package.loaded['Astar'].
  • The contents of package.loaded['Astar'] are returned.
    • Note that the script can load the package into package.loaded['Astar'] as part of its execution and return nothing.

As somebody noted in the comments above, your problem may come from loading the module using 'AStar' instead of 'Astar'. It's possible that Lua is loading this script using this string (since, on the case-insensitive Windows, a search for a file named "AStar.lua" will open a file called "Astar.lua"), but the script isn't operating with that (by using a hard-coded "Astar" instead of the "AStar" Lua is loading the script under).


You need to add return Astar at the end of Astar.lua.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜