2009-11-12 54 views
2

我有3个LUA文件,Init.lua,FreeCamera.lua和Camera.lua,为什么我会得到“试图调用全局”的要求'(一个零值)“?

init.lua通话需要 “Core.Camera.FreeCamera”

免费摄像头:

module(...) 
require "Core.Camera.Camera" 

local M = {} 
FreeCamera = M 

M = Class(Camera) 
function M:__constructor(x,y,z) 
    self.Active = false 
    self.x = x 
    self.y = y 
    self.z = z 
end 

module(...) 

local M = {} 
Camera = M 

M = Class() 

function M:__constructor(x,y,z) 
    self.Active = false 
    self.x = x 
    self.y = y 
    self.z = z 
end 

FreeCamera“继承”Camera类。我试图在我的init文件中要求FreeCamera,我得到这个:

.. \ Content \ Modules \ Core \ Camera \ FreeCamera.lua:12:尝试调用全局'require'(一个零值)。任何想法为什么?我使用的方法是否正确? 很明显,它正在进入FreeCamera.lua,这非常棒,但它在下一个需求中陷入困境。

回答

12

要“进口”标识为一个模块,可以编写代码类似以下内容:

local require = require 
local Class = Class 
local io, table, string 
    = io, table, string 
local type, pairs, ipairs, assert 
    = type, pairs, ipairs, assert 

module(...) 

local Camera = require 'Core.Camera.Camera' 

等。

module(...)命令从您的全局变量名称空间—中删除(几乎)所有内容,它会创建属于新模块的新全局名称空间。除了诸如_M_G之类的几个特殊标识符之外,新的名称空间是空的。但local标识符保持可见。

local声明使您的模块的依赖关系清晰,并且它们还可以传达您的意图。作为奖励,他们可以更有效地访问指定的标识符。所以这是非常好的Lua风格。

+2

完美!我在模块功能的评论页面中注意到了这一点,我很高兴知道它是很好的风格! – Joe 2009-11-13 17:49:37

7

module函数创建一个新的空白环境,所以调用require时不会找到。在致电module之前,请尝试拨打require

+1

这似乎已经做到了,现在它说Class()是零,但如果我从全局改变它,要求,它应该根据你所说的工作。 – Joe 2009-11-13 00:00:43

0

您可以:

lua module(..., package.seeall)

要导入全球环境到您的模块。这(推测)是最简单的解决方案,但可能不符合你的口味。

+1

这是一种便捷的解决方案,但由于在模块环境中包含了全局环境,因此引入了一系列其他问题。目前的最佳做法是避免使用'module()'函数并慷慨地使用'local'。请注意,在Lua 5.2中,例如,不推荐使用函数'module()'。 – RBerteig 2013-04-15 23:01:04

相关问题