# Any
Any
— произвольный тип данных. Он является общим надтипом всех типов: значение типа Any может быть строкой, числом, unit
, структурой, списком, кортежем и т. п.
# as, exactAs
Если конкретный тип значения известен заранее, привести значение к этому типу можно с помощью макросов:
as[T]
— возвращает значение типаT
, а если значение не соответствует типу, возвращаетunit
.exactAs[T]
— возвращает значение типаT
, а если значение не соответствует типу, завершается ошибкой.
⚠️ Не передавайте кортежи длиной более 9, а также Union-типы в качестве аргумента.
Примеры:
Значение — базовый тип:
func f1(a: Any) = a.as[Int] f1(10).value() + 1 # Возвращает 11 f1("Waves").isDefined() # Возвращает false
Значение является кортежем:
func f2(a: Any) = a.exactAs[(Int,String)] f2((11,"Ride"))._2 + " the Waves!" # Возвращает "Ride the Waves!" f2(true) # Завершается ошибкой
Значение является списком:
func f3(a: Any) = a.exactAs[List[Any]] f3([12,"Ride"])[0].exactAs[Int] # Возвращает 12 f3(88) # Завершается ошибкой
В следующем примере вызываемая функция second
возвращает значение, которое использует вызывающая функция first
(см. раздел Вызов dApp из dApp):
{-# STDLIB_VERSION 8 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func first() = {
strict d = invoke(this,"second",[],[])
[
IntegerEntry("key",d.exactAs[Int])
]
}
@Callable(i)
func second() = {
( [], 42 )
}
# match ... case
Если конкретный тип значения из Any
заранее неизвестен, определить его можно с помощью оператора match-case.
⚠️ Не используйте match-case
с кортежами длиной более 9.
Пример:
func findString(a: Any) = {
match a {
case a: String => a
case a: List[Any] =>
match a[0] {
case b: String => b
case _ => throw("Data is not a string")
}
case _ => throw("Data is not a string")
}
}