В чём различие `var ... = ...` и `var ... := ...` в GDScript?

Рейтинг: 1Ответов: 1Опубликовано: 01.08.2023

Есть такой код на GDScript:

var a := 5

И такой:

var a = 5

Оба кода при выполнении создадут переменную с именем a и значением 5.

Но в чём разница этих двух вариантов?

Ответы

▲ 3Принят

Двоеточие задаёт тип переменной. Если тип не указан, Godot попытается его вывести автоматически из выражения:

var a := 5
# То же самое, что и
var a: int = 5

Заменить значение переменной на другой тип будет нельзя:

a = "я не int"
# Parse Error: Value of type "String" cannot be assigned to a variable of type "int".

Если двоеточие не указывать, то переменная получает тип Variant, что по сути означает, что значение может быть любого типа:

var a = 5
# То же самое, что и
var a: Variant = 5

a = "я не int, но я тоже Variant"  # Работает

Если значение является результатом вызова функции, то тип может быть выведен из возвращаемого значения, но только если в функции указан его тип:

func untyped():
    return 5

var a1 := untyped()  # Не работает
var a2: Variant = untyped()  # Работает

func typed() -> int:
    return 5

var a3 := typed()  # Работает (тип int)
var a4 = typed()  # Работает (тип Variant, потому что двоеточия нет)

func typed_variant() -> Variant:
    return 5

var a5 := typed_variant()  # Работает (тип Variant), но пишет предупреждение
var a6: Variant = typed_variant()  # Работает без предупреждений

Подробнее о статической типизации в документации: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/static_typing.html