コンテンツへスキップ

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)

この式は、型文法でも使用できます。