2016-05-30 30 views
1

我正在寫lua腳本的程序不支持存儲upvalues。因此,功能fun不會恢復程序的狀態後有效:Lua使價值不變

gen=function(par) 
    local a=par 
    return function() print(a) end 
    end 
fun=gen(2) 

在另一方面簡單的功能,而無需關閉像gen保存和正常加載。 我想用上面的參數a的不同值創建一組類似於fun的函數。程式化相當於:

fun1=function() 
    local a=1 
    print(a) 
end 
fun2=function() 
    local a=2 
    print(a) 
end 
--and so on 

有沒有可能這樣做?

回答

1

您可以創建,其行爲就像你的函數表(但是,因爲它是一個表,它應該有希望被正確還原):

gen = function(par) 
    return setmetatable({a = par}, { 
      __call = function(self) 
       print(self.a) 
      end 
     }) 
end 

fun = gen(1) -- Note: fun is a table, but can be called like a function. 
fun() 

如果您需要的參數添加到您的表格功能,你可以簡單地通過添加參數到__call元方法做到這一點:

gen = function(par) 
    return setmetatable({a = par}, { 
      __call = function(self, something) 
       print(self.a, something) 
      end 
     }) 
end 

fun = gen(1) 
fun("foobar") -- Outputs "1 foobar" 

退房的Lua manual, section 'Metatables and Metamethods'更多信息!