# Union
Тип объединения — тип данных, который объединяет два или более типа данных и представляет значение одного из этих типов. Объединение может включать как простые типы, так и списки, кортежи, структуры.
Примеры:
Тип элементов списка — это объединение типов всех элементов. Например, каждый элемент списка
List[Int|String]
— это строка или число.let aList = [1, 2, "Waves"] # List[Int|String] let bList = [true,false] # List[Boolean] let joined = aList ++ bList # List[Boolean|Int|String]
Тип аргумента функции wavesBalance(Address|Alias): BalanceDetails — объединение типов Address и Alias. Вызвать функцию можно с аргументом любого из этих типов.
wavesBalance(Address(base58'3Mz9N7YPfZPWGd4yYaX6H53Gcgrq6ifYiH7')) wavesBalance(Alias("merry")) # Результат одинаковый
Тип возвращаемого значения функции getInteger(Address|Alias, String): Int|Unit — объединение типов Int и Unit. Функция возвращает целое число по ключу из хранилища данных указанного аккаунта, а если запись с таким ключом отсутствует или значение имеет другой тип, возвращает
unit
.let addr = Address(base58'3N4iKL6ikwxiL7yNvWQmw7rg3wGna8uL6LU') getInteger(addr,"integerVal") # Возвращает 1 getInteger(addr,"noKey") # Возвращает unit
# Функции и операторы
Значение с типом объединения нельзя использовать в качестве аргумента функции или оператора, если требуется конкретный тип. Например, выражение
size(getString("key"))
приведет к ошибке компиляции, поскольку тип аргумента функции size — String
, а тип возвращаемого значения функции getString — объединение String|Unit
. Получить значение с типом String
можно с помощью функции getStringValue:
size(getStringValue("key"))
Чтобы получить значение конкретного типа из объединения, можно использовать:
Пример:
func getAssetName(assetId: ByteVector|Unit) = {
match assetId {
case id: ByteVector => assetInfo(id).value().name
case waves: Unit => "WAVES"
}
}