Lua中require的工作原理

我正在使用一个允许您在Lua中编程的图形库。我需要A*路径查找库,所以我在网上找到了一个。它只是一个做路径查找的1个lua文件和一个示例文件。在示例文件中,它使用对象如下:

- 加载库
local Astar = require 'Astar'
Astar(map,1) - 初始化库,将OBST_VALUE设置为1

我运行脚本,一切正常。因此,我将Astar.lua文件添加到我的图形引擎正在运行的路径位置,然后做同样的事情,我在Astar(map,1)行上获得错误:

“尝试调用本地'AStar'(一个数字值)”

为什么会出现这种错误?为什么我做的与这个AStar lib附带的示例相同而出现了这种错误?

这是一些AStar文件的示例

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

- 加载地图,设置不能行走的价值,初始化路径查找
function Astar:init(map,obstvalue)
    self.map = map
        self.OBST_VALUE = obstvalue或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。

原文链接 https://stackoverflow.com/questions/6902059

点赞
stackoverflow用户107090
stackoverflow用户107090

你需要在 Astar.lua 的结尾添加 return Astar

2011-08-01 20:25:09
stackoverflow用户34799
stackoverflow用户34799

当你运行 require('Astar') 的时候,会发生以下事情:

  • 检查 package.loaded['Astar'] 是否是非空值。

  - 如果是,返回该值。否则,继续执行下面步骤。

  • 根据 package.path(和 package.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 正在加载的脚本)。

2011-08-21 06:26:23