匿名与非匿名函数Lua

Ank*_*Ank 7 lua functional-programming function anonymous-function

我正在学习Lua,并且遇到了匿名函数的概念.这很有趣,但我想知道它提供了什么额外的优势,而非匿名功能.

所以,如果我有类似的东西

function(a,b) return (a+b) end
Run Code Online (Sandbox Code Playgroud)

该功能是匿名的,如果我有

function add(a,b) return (a+b) end
Run Code Online (Sandbox Code Playgroud)

该功能不是匿名的.第二个更好,因为我可以在任何我想要的地方调用它,我也知道我的功能在做什么.那么匿名函数的优势是什么?我在这里错过了什么吗?

Mic*_*man 22

说实话,在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)
Run Code Online (Sandbox Code Playgroud)

关键是你很可能以后不需要这个功能.当然,您也可以将函数保存到(可能是本地的)变量并使用:

local nameComparator = function (a,b) return a.name < b.name end
table.sort(people, nameComparator)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读本节有关PiL中的功能的内容.


Max*_* E. 5

第二个例子相当于
add = function(a,b) return a+b end
所以实际上你一直在使用匿名函数,在一个微不足道的意义上。

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

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))
Run Code Online (Sandbox Code Playgroud)

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