Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Variant

Il tipo di dati più importante in Godot.

Descrizione

Nella programmazione informatica, una classe Variant è una classe progettata per memorizzare una varietà di altri tipi. Linguaggi di programmazione dinamici come PHP, Lua, JavaScript e GDScript le utilizzano spesso per memorizzare i dati delle variabili nel backend. Grazie alle classi Variant, le proprietà possono cambiare liberamente il proprio tipo di valore.

var foo = 2 # foo è dinamicamente un intero
foo = "Ora foo è una stringa!"
foo = RefCounted.new() # foo è un Object
var bar: int = 2 # bar è un intero tipizzato staticamente.
# bar = "Uh oh! Non posso far cambiare il tipo di una variabile tipizzata staticamente!"

Godot tiene traccia di tutte le variabili dell'API di scripting dentro Variant. Senza nemmeno rendertene conto, usi le Variant continuamente. Quando un particolare linguaggio impone le proprie regole per mantenere i dati tipizzati, quel linguaggio applica la propria logica personalizzata all'API base di scripting Variant .

  • GDScript incapsula automaticamente i valori in Variant. Solitamente mantiene tutti i dati in semplici Variant e, facoltativamente, impone regole di tipizzazione statica personalizzate sui tipi di variabile.

  • C# è tipizzato staticamente, ma utilizza la propria implementazione del tipo Variant al posto della classe Variant di Godot quando deve rappresentare un valore dinamico. A una Variant di C# ci si può assegnare implicitamente qualsiasi tipo compatibile, ma la conversione richiede un cast esplicito.

La funzione globale @GlobalScope.typeof() restituisce il valore enumerato del tipo Variant memorizzato nella variabile attuale (vedi Variant.Type).

var foo = 2
match typeof(foo):
    TYPE_NIL:
        print("foo è null")
    TYPE_INT:
        print("foo è un intero")
    TYPE_OBJECT:
        # Nota che gli oggetti fanno parte della loro categoria speciale.
        # Per ottenere il nome del tipo di Object sottostante, c'è bisogno del metodo `get_class()`.
        print("foo is a(n) %s" % foo.get_class()) # inserisce il nome della classe in una stringa formattata.
        # Nota che questo metodo non ottiene l'identificatore globale `class_name` dello script.
        # Se è necessario il `class_name`, usa `foo.get_script().get_global_name()` al suo posto.

Una Variant occupa solo 20 byte e può memorizzare al suo interno quasi tutti i tipi di dati del motore. Raramente servono per conservare informazioni per lunghi periodi di tempo. Invece, servono principalmente per comunicare, modificare, serializzare e trasferire dati.

Godot ha investito specificamente nella creazione di una classe Variant il più flessibile possibile, tanto da utilizzarla per una moltitudine di operazioni al fine di facilitare la comunicazione tra tutti i sistemi di Godot.

Un Variant:

  • Può memorizzare quasi tutti i tipi di dati.

  • Può effettuare operazioni tra più Variant. GDScript usa Variant come tipo di dati atomico/nativo.

  • Può essere convertito in un hash, così da confrontarlo rapidamente con altri Variant.

  • Può servire per convertire in modo sicuro tra tipi diversi di dati.

  • Può servire per astrarre le chiamate ai metodi e i relativi argomenti. Godot esporta tutte le sue funzioni tramite Variant.

  • Può servire per differire chiamate o trasferire dati tra più thread.

  • Può essere serializzato in binario, e memorizzato su disco o trasferito in rete.

  • Può essere serializzato in testo e utilizzato per stampare valori e impostazioni modificabili.

  • Può funzionare come proprietà esportata, consentendo all'editor di modificarla universalmente.

  • Può essere utilizzato per dizionari, array, parser, ecc.

Contenitori (Array e Dizionario): Entrambi sono implementati utilizzando le Variant. Un Dictionary può associare qualsiasi tipo di dato utilizzato come chiave a qualsiasi altro tipo di dato. Un Array contiene semplicemente un array di Variant. Naturalmente, una Variant può anche contenere al suo interno un Dictionary e un Array, rendendola ancora più flessibile.

Le modifiche a un contenitore modificheranno tutti i riferimenti ad esso. Bisognerebbe creare un Mutex per bloccarlo se si desidera accedervi su più thread.

Nota

Ci sono differenze sostanziali quando si usa questa API con C#. Vedi Differenze dell'API C# rispetto a GDScript per maggiori informazioni.

Tutorial