首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匿名函数与非匿名函数Lua

匿名函数与非匿名函数Lua
EN

Stack Overflow用户
提问于 2011-11-16 03:30:40
回答 2查看 8.7K关注 0票数 7

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

所以如果我有像这样的东西

代码语言:javascript
复制
function(a,b) return (a+b) end

该函数是匿名的,如果我有

代码语言:javascript
复制
function add(a,b) return (a+b) end

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-16 03:47:26

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

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

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

代码语言:javascript
复制
people = {{name="John", age=20}, {name="Ann", age=25}}
table.sort(people, function (a,b) return a.name < b.name end)

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

代码语言:javascript
复制
local nameComparator = function (a,b) return a.name < b.name end
table.sort(people, nameComparator)

有关更多信息,请阅读此section on functions in PiL

票数 24
EN

Stack Overflow用户

发布于 2011-11-16 03:52:54

第二个示例等同于

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

所以实际上你一直都在使用匿名函数,在微不足道的意义上。

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

代码语言:javascript
复制
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))

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8142026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档