Closures in Lua

Lua supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.

-- This function intSeq returns another function, which
-- we define anonymously in the body of intSeq. The
-- returned function closes over the variable i to
-- form a closure.
function intSeq()
    local i = 0
    return function()
        i = i + 1
        return i
    end
end

-- In the main part of our script
local function main()
    -- We call intSeq, assigning the result (a function)
    -- to nextInt. This function value captures its
    -- own i value, which will be updated each time
    -- we call nextInt.
    local nextInt = intSeq()

    -- See the effect of the closure by calling nextInt
    -- a few times.
    print(nextInt())
    print(nextInt())
    print(nextInt())

    -- To confirm that the state is unique to that
    -- particular function, create and test a new one.
    local newInts = intSeq()
    print(newInts())
end

main()

To run the script, save it as closures.lua and use the Lua interpreter:

$ lua closures.lua
1
2
3
1

In this Lua example, we’ve created a closure that generates a sequence of integers. The intSeq function returns an anonymous function that increments and returns a counter. Each time we call intSeq(), we get a new function with its own separate counter.

The main function demonstrates how to use this closure. We create a nextInt function by calling intSeq(), and then call it multiple times to see the counter increment. We also create a second function newInts to show that it has its own separate state.

This example showcases Lua’s support for first-class functions and closures, which are powerful features for creating flexible and maintainable code.

The last feature of functions we’ll look at for now is recursion.

查看推荐产品

Comments powered by Disqus