2011-05-30 28 views
2

希望您度過愉快的一天。LuaLanes無法在函數之間傳遞全局變量(在單個通道中)

過去幾天我一直在Lua編寫一個IRC聊天機器人,最後我想開始在其中實現多個服務器支持。

到目前爲止,我已經創建了irc「object」來管理每個服務器以及所有這些快樂的東西 - 現在,我遇到了線程問題。

如你所知,Lua沒有內置的線程支持。就圖書館而言,LuaLanes和LuaThreads似乎與我想使用的最接近。是什麼讓我選擇LuaLanes是因爲LuaThreads需要修改lua核心。再加上LuaLane的「lindas」特性引起了我的注意(以後用於插件)

無論如何,我遇到的問題是當您使用函數middleman(例如)生成一個通道時,然後調用另一個函數sqr(例如)。如果你生成的功能如lanes.gen({globals = _G}, middleman),middleman將有權訪問當前全局範圍內的所有內容,這正是我想要的。問題是,如果middleman調用sqr,並且sqr使用全局範圍內的某個值,則會引發錯誤,就好像_G突然變空了一樣。

下面是一些示例代碼,我設法一起扔了,用我上面的例子:

require 'lanes' 

function sqr() 
    print(5*5) 
end 

function middleman() 
    sqr() 
end 

gen = lanes.gen({globals = _G}, middleman) 

print(gen()[1]) 

產生一個錯誤說:

[email protected]:~$ lua lanestrouble.lua 
lua: lanestrouble.lua:4: attempt to call global 'print' (a nil value) 
stack traceback: 
     [C]: in function 'error' 
     ./lanes.lua:190: in function <./lanes.lua:136> 
     lanestrouble.lua:13: in main chunk 
     [C]: ? 
threading.c 399: pthread_cond_destroy(ref) failed, 16 EBUSY 
Aborted 
[email protected]:~$ 

(順便說一句,我使用的Linux)

但是,如果您將第11行從gen = lanes.gen({globals = _G}, middleman)更改爲gen = lanes.gen({globals = _G}, sqr),它工作正常。

我已經檢查過,如果您通過「*」(或「libs_str」參數的任何其他選項)加載默認庫,也會發生同樣的情況。

我真的希望有一些像Lua的Java線程庫,這就是我最初學習如何使用線程。 (我知道,不是我想的最理想的環境)

謝謝,我很感謝幫助。特別是因爲這完全停止了我的IRC bot開發! :(

回答

3

製作sqr當地的伎倆。因爲它成爲中間人的的upvalue,它被複制到新的車道。

require 'lanes' 

local function sqr() 
    print(5*5) 
end 

function middleman() 
    sqr() 
end 

gen = lanes.gen({globals = _G}, middleman) 

print(gen()[1]) 

但可以肯定一些奇怪路過的時候是怎麼回事。我的意思是,即使顯示「sqr」和「print」到新的通道,它不會看到「print」(當被「sqr」調用時)。在我看來,在通道之間序列化函數時,某些東西不能正常工作, maintainer

+0

\ o/Thanks a ton!非常感謝。無可否認,將所有東西都放在本地但仍然可用, o知道解決方法。 (我說謝謝?) – FurryHead 2011-06-01 20:22:48