Function 匿名与非匿名函数Lua

Function 匿名与非匿名函数Lua,function,functional-programming,lua,anonymous-function,Function,Functional Programming,Lua,Anonymous Function,我正在学习Lua,并且接触到了匿名函数的概念。这很有趣,但我想知道它比非匿名函数还有什么额外的优势 所以如果我有 function(a,b) return (a+b) end 函数是匿名的,如果我有 function add(a,b) return (a+b) end 该函数是非匿名的。第二个更好,因为我可以在任何地方调用它,我也知道我的函数在做什么。那么匿名函数的优势是什么呢?我在这里遗漏了什么吗?老实说,Lua中没有命名函数。所有函数实际上都是匿名的,但可以存储在变量(有名称)中 命名函

我正在学习Lua,并且接触到了匿名函数的概念。这很有趣,但我想知道它比非匿名函数还有什么额外的优势

所以如果我有

function(a,b) return (a+b) end
函数是匿名的,如果我有

function add(a,b) return (a+b) end

该函数是非匿名的。第二个更好,因为我可以在任何地方调用它,我也知道我的函数在做什么。那么匿名函数的优势是什么呢?我在这里遗漏了什么吗?

老实说,Lua中没有命名函数。所有函数实际上都是匿名的,但可以存储在变量(有名称)中

命名函数语法
function add(a,b)return a+b end
实际上是
add=function(a,b)return a+b end

函数通常用作事件处理程序,用于库不知道/不知道的决策,最著名的例子是
table.sort()
-使用函数,可以指定排序顺序:

people = {{name="John", age=20}, {name="Ann", age=25}}
table.sort(people, function (a,b) return a.name < b.name end)
people={{name=“John”,age=20},{name=“Ann”,age=25}
表.sort(人员,函数(a,b)返回a.name
关键是,您以后很可能不需要该函数。当然,您也可以将函数保存为(可能是局部)变量并使用该变量:

local nameComparator = function (a,b) return a.name < b.name end
table.sort(people, nameComparator)
localnameparator=函数(a,b)返回a.name

有关更多信息,请阅读此内容。

第二个示例相当于
add=函数(a,b)返回a+b结束

实际上,你一直在使用匿名函数,从一个微不足道的意义上说

但是,匿名函数在其他上下文中可能更有用。例如,使用函数变异其他函数(函数编程的灵魂)


基本上,如果愿意,您可以为每个函数创建一个名称,但是如果您要使用这么多一次性函数,那么不这样做会更方便

你倒过来了。一个更有用的心智模型是处理函数f(…)。。。end
作为
局部f=函数(…)的语法糖。。。结束
,将函数一般视为程序的对象,而不是静态构建块。你不会问为什么你可以使用数字文字而不先给他们一个复杂的英文名字,是吗?
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))