2009-11-12 29 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

相關問題