Могут ли Godot и GDScript хранить функции в переменных?

Меня смущает часть документации Godot для Язык GDScript. Примерно в середине страницы, в разделе «Ссылки на функции», говорится, что вы не можете хранить функции в переменных, а затем, кажется, сразу же противоречит самому себе.

Могут ли функции Годо храниться в переменных или нет?

Referencing Functions

Contrary to Python, functions are not first class objects in GDScript. This means they cannot be stored in variables, passed as an argument to another function or be returned from other functions. This is for performance reasons.

To reference a function by name at runtime, (e.g. to store it in a variable, or pass it to another function as an argument) one must use the call or funcref helpers:

Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
6
0
6 413
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функции GDScript не являются объектами, как в Python. Таким образом, вы не можете напрямую ссылаться на функцию.

Однако вы можете косвенно ссылаться на них по имени, используя связанный с ними экземпляр.

Например, со следующей функцией:

func hello():
    print('Hello')

Вы можете вызвать функцию экземпляра по имени:

call('hello') # prints 'Hello'

Вы можете сохранить имя экземпляра и функции с помощью funcref():

var ref = funcref(hello_object_instance, 'hello')
ref.call_func() # prints 'Hello'
takes_func_ref_to_call_later(ref) # later, prints 'Hello'

FuncRef.call_func() делает то же самое, что и Object.call(), он просто оборачивает его в объект.

Следовательно, общий шаблон для функций обратного вызова, как показали Object.connect() и его друзья, таков:

func deferred_finish(param1, param2, callback_obj, callback_func):
    # ... do something
    callback_ref = funcref(callback_obj, callback_func)
func _process(delta):
    if _finished:
        callback_ref.call_func()
func _enter_tree():
    deferred_finish('hello', 'world', self, 'finished_callback')

Надеюсь, это поможет. Дайте мне знать, если вам нужны пояснения.

Просто добавлю: в Godot 3.2 планируется добавить функциональные переменные и лямбда-синтаксис, см. github.com/godotengine/godot-roadmap/issues/23. Учитывая существующую историю выпусков, это вполне может произойти в 2020 году.

adabru 21.02.2019 21:21

Обновление, упомянутое в комментарии @adabru, похоже, отложено до версии 4.0.

unlut 19.03.2020 12:32

Другие вопросы по теме