Cuando se trabaja con datos, a menudo es necesario convertir de un tipo de datos a otro. Por ejemplo, para mostrar el resultado de un cálculo es necesario convertir de float a string (cadena).
Toda conversión de tipo dentro de Verse es explícita, lo que significa que debes utilizar una función como ToString()
o utilizar un operador como multiplicar (*
) para convertir un objeto a un tipo de datos diferente. La conversión explícita de un tipo a otro también se denomina casting de tipo.
Conversión de Float a Int
Convertir de float a int requiere una función que especifique explícitamente cómo convertirá de un número de punto flotante a un número entero. Las siguientes funciones se encargan de la conversión, pero todas trabajan de forma diferente. Depende de ti decidir cuál funciona mejor en cada situación.
En este ejemplo, diferentes funciones convierten cuatro valores literales de float
en valores de int
. A continuación, set
asigna los valores a variables de tipo int
. La expresión if
crea el contexto de fallo para estas funciones falibles.
var WoodCollected:int = 0
var StoneCollected:int = 0
var GoldCollected:int = 0
var FoodCollected:int = 0
if:
# WoodCollected ahora es 2
set WoodCollected = Round[1.5]
# StoneCollected ahora es 1
set StoneCollected = Floor[1.9]
# GoldCollected ahora es 2
set GoldCollected = Ceil[1.2]
# FoodCollected ahora es 1
set FoodCollected = Int[1.56]
Print("WoodCollected: {WoodCollected}")
Print("StoneCollected: {StoneCollected}")
Print("GoldCollected: {GoldCollected}")
Print("FoodCollected: {FoodCollected}")
Conversión de Int a Float
La forma de convertir un tipo de dato int a float es multiplicar el entero por 1.0. El operador multiplicar (*
) convierte el entero en un número de punto flotante antes de realizar la multiplicación.
Este código convierte la variable StartingPositionX
de int
en float
mediante multiplicación para que pueda utilizarse en la declaración de una variable vector3
. El tipo de datos vector3
requiere valores de tipo float
para sus campos X
, Y
y Z
.
var StartingPositionX:int = 960
# CurrentX = 960.0
var CurrentX:float = StartingPositionX * 1.0
var CurrentPosition:vector3 = vector3{X := CurrentX, Y := 0.0, Z := 0.0}
Print("CurrentX: {CurrentX}")
Conversión a cadena
Puedes convertir varios tipos de datos a string
mediante una función ToString()
o interpolación de cadenas, que llama a una función ToString()
. Actualmente, los siguientes tipos tienen funciones ToString()
integradas en Verse.
- float (flotante)
- int (entero)
- []char
- char
- vector2
- vector3
- rotation (rotación)
En este ejemplo, puedes ver variables que se convierten en una cadena a través de las funciones de interpolación de cadenas y ToString()
. Ambos métodos tienen el mismo resultado porque la interpolación de cadenas llama a ToString()
.
var WoodCollected:int = 100
# Conversión mediante interpolación de cadenas
Print("WoodCollected: { WoodCollected }")
# o la función ToString()
Print("WoodCollected: " + ToString(WoodCollected))
var InitialDistance:float = 3.625
# Conversión mediante interpolación de cadenas
Print("InitialDistance: { InitialDistance }")
# o la función ToString()
Print("InitialDistance: " + ToString(InitialDistance))
var CurrentPosition : vector3 = vector3{X:= 960.0, Y:= 540.0, Z := 20.0}
# Conversión mediante interpolación de cadenas
Print("CurrentPosition: { CurrentPosition }")
# o la función ToString()
Print("CurrentPosition: " + ToString(CurrentPosition))
Conversión de un tipo de datos personalizado a cadena
Los tipos de datos personalizados también pueden convertirse en cadenas mediante la implementación de una función ToString(custom_type)
para el tipo de datos. Si existe una función ToString(custom_type)
, la interpolación de cadenas la usará para convertir automáticamente tipos de datos en cadenas.
Este es un ejemplo de una función ToString()
personalizada para un enum
de frutas.
fruit := enum:
Apple
Banana
Strawberry (Fresa)
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Apple => "Apple"
fruit.Banana => "Banana"
fruit.Strawberry => "Strawberry"
PickUpFruit():void =
# Ejemplos de uso de la interpolación de cadenas para convertir datos en cadenas
var FruitItem:fruit = fruit.Banana
# Recolectó: Banana
Print("Picked up: {FruitItem}")
set FruitItem = fruit.Apple
# Recolectó: Apple
Print("Picked up: {FruitItem}")
Este es un ejemplo de una función ToString()
personalizada para una clase personalizada. Observa que la función ToString()
está declarada fuera de la clase waypoint
. En la función SetDestination()
, la interpolación de cadenas de Destination
está llamando a la función personalizada ToString()
.
# Clase personalizada con un constructor y una función ToString()
waypoint := class():
DisplayName:string
Position:vector3 = vector3{}
MakeWaypoint<constructor>(Name:string, X:float, Y:float, Z:float) := waypoint:
DisplayName := Name
Position := vector3{X := X, Y := Y, Z := Z}
ToString(Waypoint: waypoint):string =
return "{Waypoint.DisplayName} at {Waypoint.Position}"
SetDestination():void =
Destination:waypoint = MakeWaypoint("River", 919.0, 452.0, 545.0)
# Río en {x=919.0, y=452.0, z=545.0}
Print("Destination: {Destination}")
Conversión de una referencia de objeto a un tipo diferente
Puedes convertir explícitamente referencias a objetos (o casting de tipo) a diferentes clases o interfaces mediante la siguiente sintaxis:
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}
El object_type_to_cast_to representa la clase o interfaz a la que se intenta convertir la referencia. Esta es una expresión falible porque la conversión de tipo fallará si el objeto no puede convertirse al tipo especificado. El intento de convertir una referencia de objeto a una clase fallará si la clase no coincide con el tipo del objeto, el tipo de una superclase o una interfaz que implemente la clase del objeto.
Este código declara una interfaz positionable
(posicionable), una clase abstracta de shape
(forma) que hereda de positionable
, y dos subclases de shape
: triangle
(tríangulo) y square
(cuadrado). A continuación, crea un objeto de tipo square
llamado MyShape
e intenta realizar un casting de tipo a otros tres tipos. Este es un desglose de los resultados.
Casting de tipo square a |
Resultado |
---|---|
square |
tiene éxito porque MyShape es un square . |
triangle |
falla porque triangle no es una superclase de square , y triangle no es una interfaz que square implemente. |
positionable |
tiene éxito porque square es una subclase de shape , y todas las subclases de shape deben implementar positionable . |
# Definiciones de clase e interfaz
positionable := interface() {}
shape := class<abstract>(positionable) {}
triangle := class(shape) {}
square := class(shape) {}
# Crea un objeto cuadrado referenciado mediante el tipo de superclase de forma
MyShape:shape = square{}
# Esto tendrá éxito ya que MySquare es un objeto cuadrado
if(MySquare := square[MyShape]):
Print("Successfully cast shape to square")
if(MyTriangle := triangle[MyShape]):
Print("This will never print.")
else:
Print("Failed to cast MyShape to triangle. This is expected behavior.")
# Esto tendrá éxito ya que la interfaz posicionable debe implementarse por subclases de forma
if(MyDrawable := positionable[MyShape]):
Print("Successfully cast shape to positionable")
En el último ejemplo, el casting de tipo funcionará pero no es necesario. Este código tendrá el mismo resultado:
MyDrawable:positionable = MyShape
Ejemplos de conversión de tipos
Un caso de uso para el casting de tipo de objeto en UEFN es encontrar actores de un cierto tipo y llamar a funciones basadas en el tipo. Para saber cómo hacerlo, consulta Cómo buscar actores con una etiqueta de juego.