typeof
Выражение typeof возвращает тип выражения:
a = 1
b = typeof(a) # => Int32
Оно принимает несколько аргументов, а результатом является объединение типов выражений:
typeof(1, "a", 'a') # => (Int32 | String | Char)
Оно часто используется в обобщённом коде, чтобы воспользоваться возможностями компилятора по выводу типов:
hash = {} of Int32 => String
another_hash = typeof(hash).new # :: Hash(Int32, String)
Поскольку typeof фактически не вычисляет выражение, его можно использовать для методов во время компиляции, как в этом примере, который рекурсивно формирует объединённый тип из вложенных обобщённых типов:
class Array
def self.elem_type(typ)
if typ.is_a?(Array)
elem_type(typ.first)
else
typ
end
end
end
nest = [1, ["b", [:c, ['d']]]]
flat = Array(typeof(Array.elem_type(nest))).new
typeof(nest) # => Array(Int32 | Array(String | Array(Symbol | Array(Char))))
typeof(flat) # => Array(String | Int32 | Symbol | Char)
Это выражение также доступно в грамматике типов.
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/typeof.html