コンテンツにスキップ

if var.is_a?(...)

ifの条件式でis_a?によるチェックを行うと、then節で変数がその型に制限されていることが保証されます。

if a.is_a?(String)
  # ここで a は String 型
end

if b.is_a?(Number)
  # ここで b は Number 型
end

くわえて、else節では変数がそれ以外の型であることが保証されます。

a = some_condition ? 1 : "hello"
# a : Int32 | String

if a.is_a?(Number)
  # a : Int32
else
  # a : String
end

is_a?によるチェックは、モジュールや抽象クラスなど、いかなる型でもチェックできます。

これは、条件でかつ (&&) が使われた場合も同様に機能します。

if a.is_a?(String) && b.is_a?(Number)
  # ここで a は String 型で b は Number 型
end

そしてこれはインスタンス変数やクラス変数では機能しません。それらの場合には、まず変数への代入を行ってください。

if @a.is_a?(String)
  # ここでも @a が String であることは保証されない
end

a = @a
if a.is_a?(String)
  # ここで a は String であることが保証される
end

# より簡潔な書き方:
if (a = @a).is_a?(String)
  # ここでは a が String であることが保証される
end