的東西,如果你不需要變異的局部變量,你可以做的是通過這些值作爲參數傳遞給生成的函數。你仍然需要手動指定要關閉的變量,但它更好,然後什麼也不做。
例如,你可以建立你的閉合看起來像
return (function(a,b,c)
return function(x) return print(a, x) end
end)(...)
我們可以做的是通過改變你的函數看起來像
function fcreate(variables, fs)
local varnames = {}
local varvalues = {}
local nvars = 0
for n,v in pairs(variables) do
nvars = nvars + 1
table.insert(varnames, n)
table.insert(varvalues, v)
end
local chunk_str = (
'return (function(' .. table.concat(varnames, ',') .. ') ' ..
'return function(x) return ' .. fs .. ' end ' ..
'end)(...)'
)
return assert(loadstring(chunk_str))(unpack(varvalues, 1, nvars))
end
local a = 1;
local f = fcreate({a=a}, 'x+a')
print(f(1), f(2))
爲什麼downvote? – 2013-06-03 01:15:33