Godot和GDScript能否将函数存储在变量中?

14

我对于Godot Docs中的一部分感到困惑,这部分关于GDScript语言。在页面的中间位置,"Referencing Functions"章节中,它说你不能将函数存储在变量中,然后似乎立刻自相矛盾。

Godot函数能否被存储在变量中?

引用函数

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

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

2个回答

22

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

希望这可以帮到你,如果你需要任何解释,请告诉我。


5
补充一下:计划在Godot 3.2中增加函数变量和lambda语法,详见 https://github.com/godotengine/godot-roadmap/issues/23。鉴于已有的发布历史,这可能在2020年实现。 - adabru
6
@adabru 的评论中提到的更新似乎被推迟到4.0版本。 - unlut

1

据我所知,这个功能在3.x版本中不可用,但它是Godot 4.0的一个特性,可以查看引用函数文档(以及关于lambda的下一节)。

基本上,您可以使用以下方式声明变量:

var f = func foo(x):
    <function body>

然后使用f.call(x)来调用存储在该变量中的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接