lua 要求如何工作

Posted

技术标签:

【中文标题】lua 要求如何工作【英文标题】:lua how require works 【发布时间】:2011-10-17 15:21:49 【问题描述】:

我正在使用一个图形库,可以让你在 Lua 中编程。我需要 A* 寻路库,所以我在网上找到了一个。它只是 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 库附带的示例相同的事情时会收到该错误?

这是 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。

【问题讨论】:

我注意到在错误消息"attempt to call local 'AStar' (a number value)" 中,S 是大写的。这是您的拼写错误还是您在某处使用了错误的大小写? 【参考方案1】:

Astar 如何添加到示例脚本的package.loaded 表中,而不是您的代码?

快速 LUA 语法糖审查:

func 'string' 等价于 func('string') tabl.ident 等价于 tabl['ident']

当您使用require('Astar') 运行脚本时,它会执行以下操作:

检查package.loaded['Astar'] 是否为非零值。 如果是,则返回此值。否则,它会在此列表中继续向下。 遍历package.path(和package.cpath)中列出的模式的文件名,带有'?'替换为“Astar”,直到找到与该模式匹配的第一个文件。 将package.loaded['Astar'] 设置为true。 以'Astar' 作为参数运行模块脚本(通过上面的路径搜索找到-为了这个示例,我们假设它不是C 模块)(在模块脚本中可作为... 访问)。 如果脚本返回一个值,则将该值放入package.loaded['Astar']。 返回package.loaded['Astar'] 的内容。 请注意,脚本可以将包加载到 package.loaded['Astar'] 作为其执行的一部分并且不返回任何内容。

正如上面 cmets 中有人指出的那样,您的问题可能来自使用“AStar”而不是“Astar”加载模块。 Lua 可能正在使用这个字符串加载这个脚本(因为在不区分大小写的 Windows 上,搜索名为“AStar.lua”的文件将打开一个名为“Astar.lua”的文件),但脚本不是使用它进行操作(通过使用硬编码的"Astar" 而不是"AStar" Lua 正在加载脚本)。

【讨论】:

【参考方案2】:

您需要在Astar.lua的末尾添加return Astar

【讨论】:

以上是关于lua 要求如何工作的主要内容,如果未能解决你的问题,请参考以下文章

LuaJIT 是如何工作的 - 解释模式

这个 C 代码(来自 lua 库,Torch)是如何编译/工作的?

是否可以将 Lua 脚本修改为要求?

Lua查找表元素过程(元表__index方法是如何工作的)

如何让KY-022红外接收器模块在Lua的NodeMCU上工作?

Kong 如何在 NGINX 和 OpenResty 上工作