Variant

Найголовніший тип даних в Godot.

Опис

У комп’ютерному програмуванні клас Variant — це клас, призначений для зберігання ряду інших типів. Мови динамічного програмування, такі як PHP, Lua, JavaScript і GDScript, люблять використовувати їх для зберігання даних змінних на сервері. За допомогою цих варіантів властивості можуть вільно змінювати типи значень.

var foo = 2 # foo є динамічним цілим числом
foo = "Тепер foo є рядком!"
foo = RefCounted.new() # foo є об'єктом
var bar: int = 2 # bar є статично типізованим цілим числом.
# bar = "Ой! Я не можу зробити так, щоб статично типізовані змінні стали іншим типом!"

Godot відстежує всі змінні API сценаріїв у Variants. Навіть не усвідомлюючи цього, ви постійно використовуєте Варіанти. Коли певна мова встановлює власні правила збереження введених даних, тоді ця мова застосовує свою власну спеціальну логіку до базового API сценаріїв Variant.

  • GDScript автоматично обгортає значення в них. Він зберігає всі дані у звичайних варіантах за замовчуванням, а потім, за бажанням, застосовує спеціальні правила статичної типізації для типів змінних.

  • C# має статичний тип, але використовує власну реалізацію типу Variant замість класу Godot Variant, коли йому потрібно представити динамічне значення. C# Variant можна неявно призначити будь-який сумісний тип, але для перетворення потрібне явне приведення.

Глобальна функція @GlobalScope.typeof() повертає перераховане значення типу Variant, що зберігається в поточній змінній (див. Variant.Type).

var foo = 2
match typeof(foo):
TYPE_NIL:
print("foo є null")
TYPE_INT:
print("foo є цілим числом")
TYPE_OBJECT:
 # Зверніть увагу, що об'єкти є окремою спеціальною категорією.
 # Щоб отримати назву основного типу об’єкта, вам потрібен метод `get_class()`.
print("foo is a(n) %s" % foo.get_class()) # ввести назву класу у відформатований рядок.
 # Зауважте, що це не отримує глобальний ідентифікатор `class_name` сценарію.
 # Якщо потрібне `class_name`, використовуйте замість нього `foo.get_script().get_global_name()`.

Варіант займає лише 20 байт і може зберігати в собі майже будь-який тип даних механізму. Варіанти рідко використовуються для зберігання інформації протягом тривалого часу. Натомість вони використовуються в основному для зв’язку, редагування, серіалізації та переміщення даних.

Godot спеціально інвестував у те, щоб зробити свій клас Variant максимально гнучким; настільки, що він використовується для безлічі операцій для полегшення зв’язку між усіма системами Godot.

Варіант:

  • Може зберігати майже будь-який тип даних.

  • Може виконувати операції між багатьма варіантами. GDScript використовує Variant як атомарний/власний тип даних.

  • Можна хешувати, тому його можна швидко порівняти з іншими варіантами.

  • Можна використовувати для безпечного перетворення між типами даних.

  • Може використовуватися для абстрактного виклику методів та їхніх аргументів. Godot експортує всі свої функції через варіанти.

  • Може використовуватися для відкладення викликів або переміщення даних між потоками.

  • Може бути серіалізовано як двійковий і збережений на диску або переданий через мережу.

  • Можна серіалізувати в текст і використовувати його для друку значень і параметрів, які можна редагувати.

  • Може працювати як експортована властивість, тому редактор може редагувати її універсально.

  • Можна використовувати для словників, масивів, парсерів тощо.

Контейнери (масив і словник): обидва реалізовані за допомогою варіантів. Dictionary може відповідати будь-якому типу даних, який використовується як ключ, до будь-якого іншого типу даних. Array містить лише масив варіантів. Звичайно, Variant також може містити всередині Dictionary і Array, що робить його ще більш гнучким.

Внесення змін до контейнера призведе до зміни всіх посилань на нього. Слід створити Mutex, щоб заблокувати його, якщо потрібен багатопоточний доступ.

Примітка

Існують значні відмінності при використанні цього API із С#. Більше інформації: ref:doc_c_sharp_differences.

Посібники