2012-10-02 72 views
1

我開始學習Lua模塊,並且在我的Lua中有一小部分出現問題。 每當我改變我的變量,它回到零。Lua模塊全局變量保留爲零?

myModule.lua

--I should note that client is a number. 
module(..., package.seeall) 
local LoggedIn = { } 

function isLogged(client) 
    return LoggedIn[client] 
end 

function logIn(client) 
    table.insert(LoggedIn,client,true) 
end 

function logOut(client) 
    table.remove(LoggedIn,client) 
end 

main.lua事件發生

package.loaded.myModule= nil; require "myModule" 

function event(client) 
    myModule.logIn(client) 
end 

function event_2(client) 
    myModule.logOut(client) 
end 

編輯:使用函數來代替,並使其局部變量。 它仍然返回零,即使我可以確認logIn函數發生沒有錯誤。甚至沒有使用註銷功能。 有什麼想法?

但稍後在main.lua我檢查客戶端是否登錄,它只是返回零。

這僅僅是模塊的限制,或者我只是訪問變量錯誤。

我應該注意我需要能夠在訪問myModule.lua的其他Luas中執行此操作。提前

+2

什麼版本的Lua,您使用的?客戶端的價值是什麼?向我們展示使用'function event'的代碼(請注意,在您的示例中,函數拼寫錯誤)。 –

回答

1

感謝你不會真的給了我們足夠的代碼完全幫助你,但是這是一個工作的例子,我建立了基於你給了我們什麼小例子:

-- myModule.lua 
module(..., package.seeall) 

LoggedIn = {} 

function isLoggedIn(client) 
    return LoggedIn[client] ~= nil 
end 

function LogIn(client) 
    LoggedIn[client] = true 
end 

function LogOut(client) 
    LoggedIn[client] = nil 
end 

並對其進行測試:

-- main.lua 
require "myModule" 

myModule.LogIn("Joe") 
myModule.LogIn("Frank") 

print(myModule.isLoggedIn("Bill")) 
print(myModule.isLoggedIn("Frank")) 

myModule.LogOut("Joe") 
print(myModule.isLoggedIn("Joe")) 

這種打印出預期:

false 
true 
false 

所以我的猜測是你沒有正確檢查LoggedIn [client]是否爲空的條件,或者當有人'註銷'時你從未真正從LoggedIn表中刪除條目。

+0

對不起,沒有更多的文件,但他們都近700線長,他們有來自遊戲的功能。 我想我真正想知道的是全局變量可以從模塊外部改變(並且它們保持這種方式直到模塊被卸載)。 – Zelly

+0

是的,你可以直接擺弄myModule.LoggedIn,除非你在myModule中聲明它(我會推薦)。如果您創建了與LoggedIn表交互的LogIn/Out函數而不是讓任何其他需要myModule的lua文件執行此操作,則會更安全和更清晰。 –

1

下使用自己的代碼(假設你在funtion修正錯字)的作品(它打印true\nnil):

package.loaded.myModule= nil; require "myModule" 
function event(client) 
    myModule.LoggedIn[client] = true 
end 

event("foo") 
print(myModule.isLogged("foo")) 

一個更好的辦法來做到這一點是添加的功能logIn爲@Mike和建議避免使用module();你可以使用這樣的事情,而不是:

local myModule = require "myModule" 
function event(client) 
    myModule.logIn(client) 
end 

event("foo") 
print(myModule.isLogged("foo")) 
print(myModule.isLogged("bar")) 

而且myModule.lua變爲:

local LoggedIn = { } 
function isLogged(client) 
    return LoggedIn[client] 
end 
function logIn(client) 
    LoggedIn[client] = true 
end 
return { LoggedIn = LoggedIn, isLogged = isLogged, logIn = logIn }