2011-12-24 53 views
3

以下Lua腳本在函數範圍方面有什麼區別?它將如何影響require 'calculator'在其他一些Lua腳本中的需求。如何在LuaState.getGlobal(function_name)中引用它。它的正確功能名稱是什麼?對宣言的優點/缺點也有任何評論。聲明Lua函數並使用正確的名稱引用

A)Calculator.lua

function foo(n) 
    return n+1; 
end 

B)Calculator.lua

calc= {} 
function calc.foo(n) 
    return n+1; 
end 

C)Calculator.lua

function foo(n) 
    return n+1; 
end 
function calculator() 
    calc = {} 
    calc.foo=foo 
    return calc 
end 

回答

2

我不知道它是什麼你的意思完全取決於這些腳本的「範圍」。這些腳本究竟做了什麼取決於它們如何被執行。你可以給他們一個不同的環境,從而改變他們認爲的「全局」。

因此,我將基於假設您正在使用dofile,dostring或類似的東西來加載它們來解釋這些腳本中的每一個的作用。也就是說,你正在將它們應用到全球環境中。

A)

這就產生了一個單一的全局變量,foo,這是一個功能。

B)

這就產生了一個單一的全局變量,calc,這是一個。這張表有一個單一的條目,其中鍵值foo,誰的價值是一個功能。

C)

這將創建全局變量。 foo是一個函數。 calculator也是一個功能。每次撥打calculator將導致全局變量calc被覆蓋。 calc的新值將是具有單個條目的表格,其中密鑰foo的值是存儲在全局變量foo中的內容的副本。

很難說方法C的「優點」是什麼,因爲它沒有任何意義。它創建兩個函數而不是一個,而第二個函數不斷創建新表。

B只是A的「命名空間」範圍版本。 Lua模塊的普遍期望是,包含它們通常會創建一個包含該模塊中所有函數的表,以避免與現有全局狀態的名稱衝突。在這方面,B可能會更好。但這主要取決於此腳本的用途。

就個人而言,對於簡單的shell腳本和實用程序腳本,我不打擾正確的模塊範圍。當我做出一個合適的模塊時,我通常會使用Lua函數module

2

不完全是一個答案,但在語義評論 - Lua中,你不聲明一個功能,您創建它。該功能在執行function(...) ... end時可用。它的可用性取決於你存儲的位置。

你要記住:

function myfun(foo) print('foo') end 

是隻是語法糖:

myfun = function(foo) print('foo') end 

如果你沒有做任何特殊,myfun成爲存儲在全局狀態的全局變量(訪問通過_G)。如果在實際調用function myfun() end之前先說local myfun,則該函數(實際上爲closure)將存儲在本地變量中,並且僅可用於本地變量的範圍。

如果使用require,它只是找到該文件並加載一次。它不會對像隱藏全局模塊這樣的模塊做任何事情,所以如果你在你的模塊Calculator.lua中寫入function foo() end,那麼調用require 'Calculator'將在全局foo中創建一個函數,你可以使用LuaState.getGlobal("foo")來訪問它。如果創建功能表(步驟B),則必須使用2個步驟:

L.getGlobal("calc") -- pushes the "calc" global (a table) to the stack 
L.getField(-1, "foo") -- gets the "foo" field from the table 
相關問題