Могут ли Godot и GDScript хранить функции в переменных? - PullRequest
0 голосов
/ 15 января 2019

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

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

Функции ссылок

В отличие от Python, функции не являются объектами первого класса в GDScript. Это означает, что они не могут быть сохранены в переменных , переданы в качестве аргумента другой функции или возвращены из других функций. Это из соображений производительности.

Для ссылки на функцию по имени во время выполнения (, например, чтобы сохранить ее в переменной, или передать ее другой функции в качестве аргумента), необходимо использовать вызов или funcref. помощники:

1 Ответ

0 голосов
/ 18 января 2019

Функции 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_instance.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')

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

...