Во время работы с данными часто требуется преобразовывать переменные из одного типа данных в другой. К примеру, для отображения результата вычисления необходимо преобразовать число с плавающей запятой (float) в строку (string).
Все преобразования типов в Verse являются явными, то есть для преобразования объекта в данные другого типа нужно использовать функцию типа ToString() или оператор, подобный умножению (*). Явное преобразование одного типа в другой также называется приведением типов.
Преобразование числа с плавающей запятой в целое число
Преобразование числа с плавающей запятой (float) в целое число (int) требует выполнения функции, которая явно определяет такое преобразование. Все следующие функции выполняют преобразование, но разными способами. Какая из них лучше подойдёт в конкретном случае — решать вам.
В данном примере разные функции преобразуют четыре литеральных значения float в значения int с помощью оператора or для создания контекста, допускающего неоднозначность. После этого set присваивает значения переменным типа int.
# The Int[] method has the <decides> effect,
# This means that we need to account for failure as it is a failable expression.
# This results in the following
# var WoodInt:int = failable expression or the value if it fails.
var WoodCollectedFloat:float = 10.5
var WoodInt:int = Int[WoodCollectedFloat] or 0
Print("Printing WoodInt Value (10): {WoodInt}")
# Similar to Int[], Floor[], Ceil[], and Round[] also have the <decides> effect
В этом примере выражение if создаёт контекст, допускающий неоднозначность, для этих функций неоднозначным результатом, а set присваивает значения переменным типа int.
var WoodCollected:int = 0
var StoneCollected:int = 0
var GoldCollected:int = 0
var FoodCollected:int = 0
if:
# This block is the condition of the if expression
# Which creates the failure context
# If any fail, the entire chain of execution is rolled back
# And the else branch, if it exists, is executed
Преобразование целого числа в число с плавающей запятой
Оператор умножения (*) преобразует целое число в число с плавающей запятой до умножения. Чтобы преобразовать целое число (int) в число с плавающей запятой (float), нужно умножить целое число на 1,0.
Этот код преобразует переменную типа int StartingPositionX в переменную типа float в процессе умножения, чтобы её можно было использовать в объявлении переменной vector3. Для полей X, Y и Z данных типа vector3 необходимы значения типа float.
# Required for the vector3 type
using { /UnrealEngine.com/Temporary/SpatialMath}
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}")Преобразование в строку
Вы можете преобразовать различные типы данных в string, используя либо функцию ToString(), либо интерполяцию строки, при выполнении которой вызывается функция ToString(). На данный момент функции ToString() реализованы для следующих типов Verse.
число с плавающей запятой
int
[]char
char
vector2
vector3
rotation
В этом примере показано преобразование переменных в строку с помощью функций интерполяции строки и ToString(). Оба метода дают одинаковый результат, поскольку при интерполяции строки вызывается ToString().
var WoodCollected:int = 100
# Convert using string interpolation
Print("WoodCollected: { WoodCollected }")
# or ToString() function
Print("WoodCollected: " + ToString(WoodCollected))
var InitialDistance:float = 3.625
# Convert using string interpolation
Print("InitialDistance: { InitialDistance }")
# or ToString() function
Преобразование пользовательского типа данных в строку
Данные пользовательских типов также можно преобразовывать в строки, реализовав функцию ToString(custom_type) для соответствующего типа данных. Если функция ToString(custom_type) существует, она используется при интерполяции строки, чтобы автоматически преобразовать данные этого типа в строки.
Приведём пример пользовательской функции ToString() для enum фруктов.
fruit := enum:
Apple
Banana
Strawberry
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Apple => "Apple"
fruit.Banana => "Banana"
fruit.Strawberry => "Strawberry"
Приведём пример пользовательской функции ToString() для пользовательского класса. Обратите внимание, что функция ToString() объявляется за пределами класса waypoint. В функции SetDestination() интерполяция строки Destination вызывает пользовательскую функцию ToString().
# Custom class with constructor and a ToString() function
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 =
Преобразование ссылки на объект в другой тип
Вы можете явно преобразовывать ссылки на объекты (или приводить типы) в другие классы или интерфейсы с помощью следующего синтаксиса:
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}object_type_to_cast_to представляет класс или интерфейс, в который нужно преобразовать ссылку. Здесь используется выражение с возможным отсутствием результата, поскольку преобразование типа может оказаться неудачным, если объект невозможно преобразовать в данный тип. Попытка преобразовать ссылку на объект в класс не удастся, если класс не соответствует типу объекта, типу суперкласса или интерфейсу, который реализует класс объекта.
Этот код объявляет интерфейс positionable, абстрактный класс shape, который наследует от positionable, и два подкласса shape: triangle и square. Затем он создаёт объект типа square с именем MyShape и пытается преобразовать его в три других типа. Результаты приведены ниже.
| Приведение типа square | Результат |
|---|---|
| успех, потому что |
| результат отсутствует, потому что |
| успех, потому что |
# Class and interface definitions
positionable := interface() {}
shape := class<abstract>(positionable) {}
triangle := class(shape) {}
square := class(shape) {}
# Create a square object referenced using the superclass type shape
MyShape:shape = square{}
# This will succeed since MySquare is a square object
В последнем примере приведение типа выполнится успешно, но не является обязательным. Этот код даст аналогичный результат:
MyDrawable:positionable = MyShapeПримеры использования преобразования типов
Одним из вариантов использования приведения типов объектов в UEFN является поиск акторов определённого типа и вызов функций с учётом этого типа. Чтобы узнать, как это сделать, см. раздел Поиск акторов по тегу игрового процесса в тегах игрового процесса.