此代码引发解析错误:
func foo():
func bar():
pass
pass
Error pasing expression, misplaced: func
是否有特殊的关键字或其他技巧来定义内部函数?
答案 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")
如果您不在运行时创建代码,您可以使用 load
加载脚本。或者使用 Inner class。
如果您不需要整个脚本,您可以使用 Expression
代替。