【问题标题】:Anonymous vs Non Anonymous functions Lua匿名与非匿名函数 Lua
【发布时间】:2011-12-29 19:59:00
【问题描述】:

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

所以如果我有类似的东西

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

函数是匿名的,如果我有

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

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

【问题讨论】:

  • 你搞错了。一个更有用的心智模型是将function f(...) ... end 视为local f = function(...) ... end 的语法糖,并将函数视为对象而不是程序的静态构建块。你不会问为什么你可以使用数字文字而不先给他们一个复杂的英文名字,是吗?

标签: function functional-programming lua anonymous-function


【解决方案1】:

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

命名的函数语法function add(a,b) return a+b end实际上是syntactic sugaradd = 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)

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

local nameComparator = function (a,b) return a.name < b.name end
table.sort(people, nameComparator)

欲了解更多信息,请阅读此section on functions in PiL

【讨论】:

    【解决方案2】:

    第二个例子等价于
    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))
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2013-03-29
      • 1970-01-01
      • 2012-10-30
      相关资源
      最近更新 更多