为什么我会“尝试呼叫全球'需要'(零值)”?

时间:2009-11-12 22:58:09

标签: lua

我有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“继承”相机类型。我试图在我的init文件中要求FreeCamera,我得到了这个:

.. \ Content \ Modules \ Core \ Camera \ FreeCamera.lua:12:尝试调用全局'require'(零值)。知道为什么?我使用需要正确的方法吗? 显然它正在进入FreeCamera.lua,这很棒,但是它会在下一个要求中遇到困难。

3 个答案:

答案 0 :(得分: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风格。

答案 1 :(得分:7)

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

答案 2 :(得分:0)

你可以:

lua module(..., package.seeall)

将全局环境导入模块。这(可能)是最简单的解决方案,但可能不符合您的口味。