Variant

El tipo de datos más importante de Godot.

Descripción

En programación de computadoras, una clase Variante es una clase que está diseñada para almacenar una variedad de otros tipos. A los lenguajes de programación dinámicos como PHP, Lua, JavaScript y GDScript les gusta usarlos para almacenar datos de variables en el backend. Con estas Variantes, las propiedades son capaces de cambiar los tipos de valores libremente.

var foo = 2 # foo es dinámicamente un entero
foo = "¡Ahora el foo es una string!"
foo = Reference.new() # foo es un objeto
var bar int = 2 # la bar es un entero escrito estáticamente.
# bar = "Uh oh! No puedo hacer que las variables estáticas se conviertan en un tipo diferente!"

Godot rastrea todas las variables de la API de scripting dentro de las Variantes. Sin siquiera darse cuenta, usa las Variants todo el tiempo. Cuando un determinado lenguaje aplica sus propias reglas para mantener los datos escritos, entonces ese lenguaje está aplicando su propia lógica personalizada sobre la API de scripting base Variante.

  • GDScript envuelve automáticamente los valores en ellos. Mantiene todos los datos en Variantes simples de forma predeterminada y luego, opcionalmente, aplica reglas de escritura estática personalizadas en los tipos de variables.

  • VisualScript también realiza un seguimiento de las propiedades dentro de las Variantes, pero también utiliza la escritura estática. La interfaz GUI hace que las propiedades tengan un tipo particular que no cambie con el tiempo.

  • C# es de tipo estático, pero utiliza el tipo Mono object en lugar de la clase Variant de Godot cuando necesita representar un valor dinámico. object es el equivalente del tiempo de ejecución de Mono del mismo concepto.

  • El lenguaje estáticamente escrito NativeScript C++ no define una clase Variant-like incorporada. Los enlaces GDNative de Godot proporcionan su propio godot::Clase variante para los usuarios; Cualquier punto en el que el código C++ comience a interactuar con el tiempo de ejecución de Godot es un lugar en el que podrías tener que comenzar a envolver datos dentro de los objetos Variant.

La función global @GDScript.typeof devuelve el valor enumerado del tipo de Variante almacenado en la variable actual (véase Variant.Type).

var foo = 2
match typeof(foo):
    TYPE_NIL:
        print("foo es nulo")
    TYPE_INTEGER:
        print("foo es un entero")
    TIPO_OBJECT:
        # NotA que los objetos son su propia categoría especial.
        # Para obtener el nombre del tipo de Objeto subyacente, necesitas el método `get_class()`.
        print("foo es a(n) %s" % foo.get_class()) # Inyectar el nombre de la clase en una string formateada.
        # Nota también que aún no hay forma de obtener fácilmente la string "nombre_de_clase" de un script.
        # Para obtener ese valor, es necesario profundizar en una configuración oculta de ProjectSettings: un Array de diccionarios llamada "_global_script_classes".
        # Abre tu archivo project.godot para verlo de cerca.

Una Variant sólo ocupa 20 bytes y puede almacenar casi cualquier tipo de datos de motor en su interior. Las Variants rara vez se utilizan para mantener la información durante largos períodos de tiempo. En cambio, se utilizan principalmente para la comunicación, la edición, la serialización y el desplazamiento de datos.

Godot ha invertido específicamente en hacer que su clase de Variant sea lo más flexible posible; tanto es así que se utiliza para una multitud de operaciones para facilitar la comunicación entre todos los sistemas de Godot.

Una Variant:

  • Puede almacenar casi cualquier tipo de datos.

  • Puede realizar operaciones entre muchas variantes. GDScript utiliza la Variant como su tipo de datos atómico/nativo.

  • Puede ser "hashed", por lo que puede ser comparado rápidamente con otras variantes.

  • Puede ser usado para convertir con seguridad entre tipos de datos.

  • Puede ser usado para abstraer métodos de llamada y sus argumentos. Godot exporta todas sus funciones a través de variants.

  • Puede utilizarse para diferir las llamadas o mover datos entre hilos.

  • Puede ser serializado como binario y almacenado en disco, o transferido a través de la red.

  • Puede ser serializado a texto y usarlo para imprimir valores y configuraciones editables.

  • Puede funcionar como una propiedad exportada, de modo que el editor puede editarla universalmente.

  • Puede ser usado para diccionarios, arrrays, analizadores, etc.

Contenedores (Array y Diccionario): Ambos se implementan utilizando variants. Un Dictionary puede hacer coincidir cualquier tipo de datos utilizado como clave con cualquier otro tipo de datos. Un Array sólo contiene una array de Variants. Por supuesto, una Variant también puede contener un Dictionary y un Array en su interior, lo que lo hace aún más flexible.

Las modificaciones de un contenedor modificarán todas las referencias a él. Debe crearse un Mutex para bloquearlo si se desea un acceso multihilo.

Tutoriales