Quando trabalhamos com dados, muitas vezes é necessário converter variáveis de um tipo de dados em outro. Por exemplo, exibir o resultado de um cálculo requer a conversão de float em uma string.
Todas as conversões de tipos em Verse são explícitas, o que significa que você deve usar uma função como ToString()
ou usar um operador, como o de multiplicação (*
), para converter um objeto em um tipo de dado diferente. A conversão explícita de um tipo em outro é chamada simplesmente de conversão de tipos.
Como converter float em int
A conversão de um float em um int requer uma função que especifique explicitamente como converterá um número de ponto flutuante em um número inteiro. As funções a seguir lidam com a conversão, mas todas funcionam de maneira diferente. Cabe a você decidir qual delas funciona melhor em uma determinada situação.
Neste exemplo, diferentes funções convertem quatro valores literais float
em valores int
. Em seguida, set
atribui os valores a variáveis do tipo int
. A expressão if
cria o contexto de falha para essas funções falíveis.
var WoodCollected:int = 0
var StoneCollected:int = 0
var GoldCollected:int = 0
var FoodCollected:int = 0
if:
# WoodCollected agora é 2
set WoodCollected = Round[1.5]
# StoneCollected agora é 1
set StoneCollected = Floor[1.9]
# GoldCollected agora é 2
set GoldCollected = Ceil[1.2]
# FoodCollected agora é 1
set FoodCollected = Int[1.56]
Print("WoodCollected: {WoodCollected}")
Print("StoneCollected: {StoneCollected}")
Print("GoldCollected: {GoldCollected}")
Print("FoodCollected: {FoodCollected}")
Como converter int em float
A maneira de converter um tipo de dados int em um float é multiplicar o número inteiro por 1.0. O operador de multiplicação (*
) converte o número inteiro em um número de ponto flutuante antes de realizar a multiplicação.
Este código converte a variável int
StartingPositionX
em um float
por meio da multiplicação, para que possa ser usada na declaração de uma variável vector3
. O tipo de dado vector3
requer valores do tipo float
para seus campos X
, Y
e 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}")
Como converter em uma string
Você pode converter vários tipos de dados em uma string
usando uma função ToString()
ou a interpolação de strings, que chama uma função ToString()
. No momento, os seguintes tipos têm funções ToString()
integradas em Verse.
- float
- int
- []char
- char
- vector2
- vector3
- rotation
Neste exemplo, é possível ver as variáveis sendo convertidas em uma string por meio da interpolação de strings e de funções ToString()
. Ambos os métodos têm o mesmo resultado porque a interpolação de strings chama ToString()
.
var WoodCollected:int = 100
# Converter usando interpolação de strings
Print("WoodCollected: { WoodCollected }")
# ou a função "ToString()"
Print("WoodCollected: " + ToString(WoodCollected))
var InitialDistance:float = 3.625
# Converter usando interpolação de strings
Print("InitialDistance: { InitialDistance }")
# ou a função "ToString()"
Print("InitialDistance: " + ToString(InitialDistance))
var CurrentPosition : vector3 = vector3{X:= 960.0, Y:= 540.0, Z := 20.0}
# Converter usando interpolação de strings
Print("CurrentPosition: { CurrentPosition }")
# ou a função "ToString()"
Print("CurrentPosition: " + ToString(CurrentPosition))
Como converter um tipo de dados personalizado em uma string
Tipos de dados personalizados também podem ser convertidos em strings, implementando uma função ToString(custom_type)
para o tipo de dados. Se existir uma função ToString(custom_type)
, a interpolação de strings irá usá-la para converter automaticamente os tipos de dados em strings.
Aqui está um exemplo de uma função ToString()
personalizada para uma enum
de frutas.
fruit := enum:
Abacaxi
Banana
Morango
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Abacaxi => "Abacaxi"
fruit.Banana => "Banana"
fruit.Morango => "Morango"
PickUpFruit():void =
# Exemplos de uso de interpolação de strings para converter dados em strings
var FruitItem:fruit = fruit.Banana
# Colhida: Banana
Print("Fruta colhida: {FruitItem}")
set FruitItem = fruit.Abacaxi
# Colhida: Abacaxi
Print("Fruta colhida: {FruitItem}")
Aqui está um exemplo de uma função ToString()
personalizada para uma classe personalizada. Observe que a função ToString()
é declarada fora da classe waypoint
. Na função SetDestination()
, a interpolação de strings de Destination
está chamando a função personalizada ToString()
.
# Classe personalizada com constructor e uma função "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("Rio", 919.0, 452.0, 545.0)
# Rio em {x=919.0, y=452.0, z=545.0}
Print("Destino: {Destination}")
Como converter uma referência de objeto em um tipo diferente
Você pode converter explicitamente referências a objetos (ou fazer a conversão de tipos) em diferentes classes ou interfaces usando a seguinte sintaxe:
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}
O object_type_to_cast_to representa a classe ou interface para a qual você está tentando converter a referência. Essa é uma expressão falível porque a conversão de tipos falhará se o objeto não puder ser convertido para o tipo especificado. A tentativa de converter uma referência de objeto em uma classe falhará se a classe não corresponder ao tipo do objeto, ao tipo de uma superclasse ou a uma interface implementada pela classe do objeto.
Este código declara uma interface positionable
, uma classe abstrata shape
que herda de positionable
e duas subclasses de shape
: triangle
e square
. Em seguida, cria um objeto do tipo square
chamado MyShape
e tenta convertê-lo em três outros tipos. Aqui está uma descrição dos resultados.
Conversão do tipo square para |
Resultado |
---|---|
square |
é bem-sucedido porque MyShape é square |
triangle |
falha porque triangle não é uma superclasse de square e triangle não é uma interface implementada por square |
positionable |
é bem-sucedido porque square é uma subclasse de shape e todas as subclasses de shape devem implementar positionable . |
# Definições de classe e interface
positionable := interface() {}
shape := class<abstract>(positionable) {}
triangle := class(shape) {}
square := class(shape) {}
# Cria um objeto "square" (quadrado) referenciado usando o tipo de superclasse "shape"
MyShape:shape = square{}
# Será bem-sucedido, pois "MySquare" é um objeto "square"
if(MySquare := square[MyShape]):
Print("Shape convertido em square")
if(MyTriangle := triangle[MyShape]):
Print("Este texto nunca será exibido.")
else:
Print("Falha ao converter MyShape em triângulo. Este comportamento é esperado.")
# Será bem-sucedido, pois a interface "positionable" deve ser implementada por subclasses de "shape"
if(MyDrawable := positionable[MyShape]):
Print("Shape convertido em positionable")
No último exemplo, a conversão de tipos funcionará, mas não é necessária. Este código terá o mesmo resultado:
MyDrawable:positionable = MyShape
Exemplos usando conversão de tipos
Um caso de uso para conversão de tipos de objeto no UEFN é encontrar atores de um determinado tipo e chamar funções com base no tipo. Para saber como fazer isso, consulte Como encontrar atores com tags de jogabilidade.