2014-07-22 31 views
1

沒有成功我試圖導入我自己的Lua文件到使用require關鍵字的其他腳本,但每當我嘗試調用包含導入的模塊中(如「test.lua」)我到了後續的錯誤:無法導入與Lua模塊,導致試圖索引全球「測試」(一個零值)

require 'test' 
test.method(args) 
==> yields error: 
==> Attempt to index global 'test' (a nil value) 

我已經添加文件到package.path的情況下,這是問題,但同樣沒有開始錯誤表明它無法在Lua的路徑中找到該文件。

package.path = package.path .. ";/path/to/test.lua" 
require 'test' 
test.method(args) 
==> yields error: 
==> Attempt to index global 'test' (a nil value) 

我從文件所在的目錄運行交互式Lua shell。當試圖打印局部變量名時,例如本地測試=要求「測試」的值爲零。

package.path = package.path .. ";/path/to/test.lua" 
local test = require 'test' 
print(test) 
==> nil 

想法? (注意:我通常也需要這個文件,不需要將它分配給一個局部變量,並且以nil作爲返回值再次打印它的值。)

+0

把你的代碼放在這裏。我們不能傳心術。 – texasbruce

+0

更新,再次它從一開始就炸燬了。 –

回答

3

要擴大lhf的答案:

Lua shell每次讀取一條語句。然後它將加載代碼字符串(或更準確地說,C API等價物),它編譯Lua代碼並返回一個執行它的函數。由於每條語句分別加載並生成不同的函數,因此它們不共享局部變量。

從本質上講,這個控制檯輸入:

local test = require "test" 

print(test) 

if test then 
    bar() 
end 

被翻譯成這樣:

(function() local test = require "test" end)() 

(function() print(test) end)() 

(function() 
    if test then 
     bar() 
    end 
end)() 

(請注意,這適用於文件以及Lua的「文件」實際上只是一個隱函數。 function(...)簽名。這意味着您可以從文件的頂層返回,也可以對文件上的功能(沙箱等)執行任何操作。)

如果你是從什麼地方複製的代碼,你可以環繞代碼do ... end,像這樣:

do 
    local test = require "test" 
    print(test) 
end 

do ... end塊計爲一個語句,作用域局部變量。

+0

美麗!通過調整我的test.lua返回[它包含在一個表對象中的全部方法](http://hisham.hm/2014/01/02/how-to-write-lua-modules-in-a -post-module-world /),我可以在我的Lua shell中需要時正確訪問這些方法。 –

1

在交互式Lua shell中,每個完整語句都以read方式執行。局部變量不能從一個陳述生存到另一個陳述。

+0

那麼,當我使用Lua4Crypto時,我可以 - 本地加密=需要「加密」,並在該變量上調用方法,沒有錯誤。 Lua4Crypto安裝了luarocks,顯然我誤解了如何將我自己的文件導入到交互式Lua shell和我的Lua腳本中。 (>。<) –

+0

@LorenaNicole,在你的第三個例子中,嘗試刪除'local'。 – lhf

相關問題