代码之家  ›  专栏  ›  技术社区  ›  LuminousNutria

godot和gdscript可以在变量中存储函数吗?

  •  0
  • LuminousNutria  · 技术社区  · 6 年前

    我对Godot的部分文档感到困惑 GDScript language . 这似乎自相矛盾。在页面的中间,在“引用函数”部分,它说你不能将函数存储在变量中,然后似乎会立即自相矛盾。

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

    引用函数

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   hola    6 年前

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

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