GDscript 中的“as”关键字有什么作用?它与仅声明变量有何不同?

Gab*_*bby 2 gdscript godot

这怎么样:

var grenade = grenade_scene.instantiate() as RigidBody2D

不同于:

var grenade: RigidBody2d = grenade_scene.instantiate()

当我使用冒号 (:) 声明 RigidBody2d 时,引擎不会自动完成 RigidBody2d 内的任何函数,但当我使用“as”关键字时,它会检测到这些函数。

我预计这两行代码是相同的。

The*_*aot 5

as运算符将实例强制转换为给定类型,null如果类型不兼容则返回。


var grenade = grenade_scene.instantiate() as RigidBody2D
Run Code Online (Sandbox Code Playgroud)

这里你声明了一个没有给定类型的变量。

如果它是该类型或派生类型,或者其他类型,则可以使用grenade_scene.instantiate()强制转换的结果来初始化它。RigidBody2Dnull


你也可以这样做:

var grenade := grenade_scene.instantiate() as RigidBody2D
Run Code Online (Sandbox Code Playgroud)

这里你声明了一个类型的变量RigidBody2D。该类型是隐式的,因为 Godot 从用于初始化变量的值推断出它。

grenade_scene.instantiate()并且 - 就像以前一样 - 您将使用强制转换的结果来初始化它(RigidBody2D如果它是该类型或派生类型,或者null其他类型)。


在上述任一情况下,您可以检查null或使用is_instanc_valid来了解转换是否失败:

if not is_instance_valid(grenade):
    push_error("invalid grenade scene")
Run Code Online (Sandbox Code Playgroud)

如果您知道它是正确的类型,您可能会选择忽略此类检查,但请注意,如果您更改类型,您将得到null并且不会出现错误或警告,这有时可能难以调试。


另一方面...

var grenade: RigidBody2d = grenade_scene.instantiate()
Run Code Online (Sandbox Code Playgroud)

这里你声明了一个类型变量RigidBody2d(原文如此)。这次类型是显式的。

现在,如果类型grenade_scene.instantiate()不兼容,您将收到运行时错误。

从可调试性的角度来看,这可以说更好。

遗憾的是,在撰写本文时,您无法使用此表单完全自动完成会员。这似乎是一个错误。这似乎已在即将推出的 Godot 4.3 中得到修复