有没有办法在另一个函数中定义一个辅助函数?

时间:2021-05-03 19:03:45

标签: function gdscript

此代码引发解析错误:

func foo():
 func bar():
   pass
 pass

Error pasing expression, misplaced: func


是否有特殊的关键字或其他技巧来定义内部函数?

1 个答案:

答案 0 :(得分:1)

Godot 3.x 中没有。 Godot 4.0 支持使用给定的语法。这是提案:"Add lambda functions in GDScript"

附录:我应该提到约定是,任何带有下划线(“_”)的星号都被视为私有。从外部访问它们需要您自担风险。 这种方法在 Python 中已经运行了很长时间

有些事情你可以做……


“私人”字段

如您所知,您可以使用 setget 来拥有每次从外部访问字段或使用 self 时都会运行的 getter 和 setter。好吧,你可以写出失败的 getter 和 setter。

例如:

var _value setget noset, noget

func noset(_new_value):
    push_error("Invalid access.")

func noget():
    push_error("Invalid access.")

当从另一个脚本使用时,这会导致错误。从同一个脚本中使用 self._value 时也会导致错误,但不使用同一个脚本中的 _value(没有 self)。因此,我们有一个“私有”字段。

同样,通过只指定setter,我们可以有一个只读属性:

var value setget noset

func noset(_new_value):
    push_error("Invalid access.")

“私有”方法

按照相同的想法,我们可以将令牌存储在私有字段中。并将其用作访问检查。我们将使用一个新对象,这样就不可能偶然匹配它。 这类似于有一个监视器(如线程中所理解的)、持有锁和执行 try_enter ......除了没有线程部分。

var _token setget noset, noget

func noset(_new_value):
    push_error("Invalid access.")

func noget():
    push_error("Invalid access.")

func _method(token):
    if token != _token: # try enter
        push_error("Invalid access") # did fail to enter
        return

    # did enter
    pass

func _init():
    _token = ClassDB.instance("Object") # hold lock

从同一个脚本中,您可以访问 _token。因此,您可以像这样调用该方法:

_method(_token)

但是,_token 是“私有的”,传递任何其他内容都会导致错误。因此,无法使用其他脚本中的方法。

这是 a comment by me2beats 的改进版本。关于提案"Add public/private access modifiers to GDScript and autocompletion improvements"


评估代码

您还可以从代码中创建一个脚本(想想“eval”)。这是通过 GDScript 类完成的。

您可以像这样创建脚本:

var script = GDScript.new()
script.source_code = "func run():print('hello world')" # create code at runtime
script.reload()

像这样实例化它:

var script_instance = script.new()

当然,您可以将实例保存在“私有”字段中。您可能还对FuncRef感兴趣。

然后使用您在其中声明的任何内容,在本例中为 run 函数:

script_instance.call("run")

callgetset


如果您不在运行时创建代码,您可以使用 load 加载脚本。或者使用 Inner class

如果您不需要整个脚本,您可以使用 Expression 代替。