Godot 和 GDScript 可以将函数存储在变量中吗?

Lum*_*ria 6 scripting function gdscript godot

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

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

引用函数

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

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

hol*_*ola 11

GDScript 函数不像在 Python 中那样是对象。因此,您不能直接引用函数。

但是,您可以使用它们关联的实例通过名称间接引用它们。

例如使用以下函数:

func hello():
    print('Hello')
Run Code Online (Sandbox Code Playgroud)

您可以按名称调用实例上的函数:

call('hello') # prints 'Hello'
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令存储实例和函数名称funcref()

var ref = funcref(hello_object_instance, 'hello')
ref.call_func() # prints 'Hello'
takes_func_ref_to_call_later(ref) # later, prints 'Hello'
Run Code Online (Sandbox Code Playgroud)

FuncRef.call_func()做同样的事情,因为Object.call()它只是将它包装在一个对象中。

因此,回调函数的常见模式,如Object.connect()和friends所示,是:

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')
Run Code Online (Sandbox Code Playgroud)

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

  • 补充一点:Godot 3.2 中计划添加函数变量和 lambda 语法,请参阅 https://github.com/godotengine/godot-roadmap/issues/23。鉴于现有的发布历史,这很可能会在 2020 年发生。 (5认同)
  • @adabru 的评论中提到的更新似乎被推迟到版本 4.0。 (4认同)