6

我对GDScript 语言的 Godot Docs 的一部分感到困惑。大约在页面的中间,在“引用函数”部分,它说您不能将函数存储在变量中,然后似乎立即自相矛盾。

Godot函数是否可以存储在变量中?

引用函数

与 Python 不同,函数不是 GDScript 中的第一类对象。这意味着它们不能存储在 variables 中,作为参数传递给另一个函数或从其他函数返回。这是出于性能原因。

要在运行时按名称引用函数(例如,将其存储在变量中,或将其作为参数传递给另一个函数),必须使用 call 或 funcref 帮助器:

4

1 回答 1

13

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')

我希望这有帮助。如果您需要任何澄清,请告诉我。

于 2019-01-18T03:16:27.170 回答