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 要求如何工作的主要内容,如果未能解决你的问题,请参考以下文章
这个 C 代码(来自 lua 库,Torch)是如何编译/工作的?