2013-08-19 30 views
1

這是所希望的效果:當兩者都是模塊時,是否可以向getfenv(2)添加函數?

-- in module: A 
module(...) 
require('B') 

new_func('my_val') -- new_func is defined in "B" 

-- in module: B 
module(...) 
getfenv(2).new_func = function() end -- this does not work 

-- this does 
getfenv(2).A.new_func = function() end 

這比實際需要更多的好奇心。我希望通過這個深奧的問題來了解更多getfenv的功能。

由於getfenv(2)應該返回一個env,爲什麼getfenv(2).new_func不能在上面的例子中工作?

我也不明白爲什麼getfenv(1) from A ~= getfenv(2) in B

(我也想避免使用debug,包括debug.setupvalue

回答

0

我想我知道是什麼問題:require沒有做什麼,我認爲它的作用:

-- in A.lua 
require("b") 

-- That is not the same as: 
(function (mod_name) 
    -- run B.lua 
end)("b") 

require運行在全球環境中的大塊:https://stackoverflow.com/a/18311328/841803

因此,getfenv(2)將返回getfenv(0)如果在打開questi中使用的方式上。

你必須由一個叫做B功能使用getfenv

-- module A 
module(...) 
require("b").import() 
new_func("some val") 

-- module B 
module(...) 

function new_func(val) 
    print(val) 
end 

function import() 
    getfenv(2).new_func = new_func 
end 
1

module全球環境設置爲一個由它的第一個參數指定的表。因此,在模塊「B」中定義的任何內容都會出現在名爲B的表格中,當運行require時,該表格將安裝在該表格中。這就是爲什麼要改變環境,您必須使用模塊名稱作爲getfenv返回的表中的索引。

您可以在「舊的方式」下找到此信息here

+0

其實,我知道'module'在全局環境中設置了一個帶有mod名稱的表。我似乎出錯的部分是'require'在不同的環境中評估模塊代碼,然後我期望的。所以'getfenv'返回了我在模塊B定義中不期望的東西。如果我在模塊B函數(而不是模塊B定義)中使用'getfenv',那麼一切都按我的想法運行。 –

+1

另外值得指出的是,既然你可以[自定義](http://www.lua.org/manual/5.2/manual.html#6.3)地獄,'require'的作品,它可能不是一個好主意(或未來證明)依靠它所做的特定環境操作。 – idoby

+0

非常真實。這就是爲什麼當'require'正在做生意時,我計劃*不*使用'getfenv'。 –

相關問題