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 tofunc('string')
tabl.ident
is equivalent totabl['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
(andpackage.cpath
), with '?' replaced with 'Astar', until it finds the first file matching the pattern. - Sets
package.loaded['Astar']
totrue
. - 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.
- Note that the script can load the package into
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
.
精彩评论