在lua中同时定义和调用函数

时间:2018-12-06 17:27:17

标签: javascript lua closures

在javascript中,可以通过同时定义和调用函数来快速创建闭包:

function() {
    local something = 1;
    return function () {
        // something
    }
}()

是否可以在lua中做同样的事情?

1 个答案:

答案 0 :(得分:3)

是的,您可以在Lua中创建立即调用的函数表达式(IIFE)。 Lua要求在函数表达式fastqs: - class: File path: /path/to/fastq_1_R1.fq.gz - class: File path: /path/to/fastq_2_R1.fq.gz fastq2s: - class: File path: /path/to/fastq_1_R2.fq.gz - class: File path: /path/to/fastq_2_R2.fq.gz sample_names: [foo, bar] 上加上括号。删除括号paired_end_fastqs: - fastq: class: File path: /path/to/fastq_1_R1.fq.gz fastq2: class: File path: /path/to/fastq_1_R2.fq.gz sample_name: foo - fastq: class: File path: /path/to/fastq_2_R1.fq.gz fastq2: class: File path: /path/to/fastq_2_R2.fq.gz sample_name: bar ,您会收到语法错误。并且无法命名该功能:(function () return 10 end)()。命名函数语法是用于将函数分配给变量function () return 10 end()的语法糖,并且赋值不是Lua中的表达式,因此不能将它们称为函数。

JavaScript要求在函数表达式周围或整个函数周围加上括号,再加上函数调用括号组合:(function f() return 10 end)()f = function() return 10 end。括号可确保将(function () { return 10; })()解释为函数表达式而不是函数声明。在Lua中,第二种构造的等效(function () { return 10; }())无效。在JavaScript中,但不能在Lua中,您可以在函数表达式中提供一个名称,如果出现错误,该名称将显示在堆栈跟踪中:function () {}(function () return 10 end())