Il secondo esempio è equivalente a
add = function(a,b) return a+b end
Quindi, in realtà si sta utilizzando funzioni anonime per tutto il tempo, in un certo senso banale.
Ma le funzioni anonime possono essere molto più utili in altri contesti. Ad esempio, utilizzando le funzioni di mutare le altre funzioni (l'anima della programmazione funzionale.)
function make_version_with_n_args (func, n)
if n == 1 then
return function (x) return x end
else
return function (x, ...)
return func (x, make_version_with_n_args (func, n-1)(...))
end
end
end
add_four = make_version_with_n_args (function (a, b) return a+b end, 4)
print (add_four(3, 3, 3, 3))
add_sizes = {}
for i = 1, 5 do
add_sizes[i] = make_version_with_n_args(function (a, b) return a+b end, i)
end
func_args = {}
for i = 1, 5 do
func_args[#func_args+1] = 2
print (add_sizes[i](unpack(func_args)))
end
function make_general_version (func)
return function (...)
local args = {...}
local result = args[#args]
for i = #args-1,1,-1 do
result = func(args[i], result)
end
return result
end
end
general_add = make_general_version (function (a, b) return a+b end)
print (general_add(4, 4, 4, 4))
In sostanza, è possibile creare un nome per ogni singola funzione, se si vuole, ma in situazioni in cui si stanno gettando in giro così tanti funzioni una tantum, è più conveniente non farlo.
fonte
2011-11-15 19:52:54
Hai fatto all'indietro. Un modello mentale molto più utile sta trattando 'function f (...) ... end' come zucchero sintattico per' local f = function (...) ... end', e pensa invece alle funzioni in generale come oggetti di elementi costitutivi statici del tuo programma. Non chiedi perché puoi usare i numeri letterali senza prima dare un nome inglese elaborato, vero? – delnan