Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

lua how require works

Tags:

require

lua

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 it came with it's returning a table, which is what it should be returning. So not sure why it would only be returning 1.

like image 676
user441521 Avatar asked Aug 01 '11 17:08

user441521


People also ask

What does Dofile do in Lua?

The dofile builtin function can be used to execute a chunk of code stored in a file.

Does Lua support OOP?

OOP in LuaYou can implement object orientation in Lua with the help of tables and first class functions of Lua. By placing functions and related data into a table, an object is formed.

What is LUA_PATH?

Lua modules and packages - what you need to know As with most search paths, the LUA_PATH is actually a semicolon-separated collection of filesystem paths. Lua scans them in the order they are listed to find a module. If the module exists in multiple paths, the module found first wins and Lua stops searching.

How do I comment multiple lines in Lua?

A comment starts with a double hyphen ( -- ) anywhere outside a string. They run until the end of the line. You can comment out a full block of code by surrounding it with --[[ and --]] . To uncomment the same block, simply add another hyphen to the first enclosure, as in ---[[ .


1 Answers

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

like image 143
Stuart P. Bentley Avatar answered Nov 11 '22 21:11

Stuart P. Bentley