Spec-Zone.ru › Crystal

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API