Closures in GDScript

# This function `int_seq` returns another function, which
# we define anonymously in the body of `int_seq`. The
# returned function closes over the variable `i` to
# form a closure.
func int_seq():
    var i = 0
    return func():
        i += 1
        return i

func _ready():
    # We call `int_seq`, assigning the result (a function)
    # to `next_int`. This function value captures its
    # own `i` value, which will be updated each time
    # we call `next_int`.
    var next_int = int_seq()

    # See the effect of the closure by calling `next_int`
    # a few times.
    print(next_int.call())
    print(next_int.call())
    print(next_int.call())

    # To confirm that the state is unique to that
    # particular function, create and test a new one.
    var new_ints = int_seq()
    print(new_ints.call())

In GDScript, closures are implemented using anonymous functions. The int_seq function returns an anonymous function that captures the i variable, forming a closure.

To use this code in Godot:

  1. Create a new script and attach it to a node in your scene.
  2. Copy the above code into the script.
  3. Run the scene.

The output will be:

1
2
3
1

This demonstrates that the closure maintains its own state (i) between calls, and that each new closure created by int_seq() has its own independent state.

In GDScript, we use func(): to define anonymous functions, and .call() to invoke them. The _ready() function is Godot’s equivalent of a main() function, automatically called when the script is loaded.

Note that in GDScript, we use print() instead of fmt.Println() for console output, and snake_case is preferred for function and variable names instead of camelCase.

The last feature of functions we’ll look at for now is recursion, which is also supported in GDScript.

查看推荐产品

Comments powered by Disqus