コンテンツにスキップ

if var.is_a?(...)

if文の条件がis_a?テストの場合、`then`ブランチでは変数の型がその型に制限されることが保証されます。

if a.is_a?(String)
  # here a is a String
end

if b.is_a?(Number)
  # here b is a Number
end

さらに、`else`ブランチでは、変数の型がその型に制限されないことが保証されます。

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

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

抽象クラスやモジュールなど、あらゆる型を`is_a?`テストで使用できることに注意してください。

上記は、条件に AND 演算子(`&&`)が含まれている場合でも機能します。

if a.is_a?(String) && b.is_a?(Number)
  # here a is a String and b is a Number
end

上記はインスタンス変数またはクラス変数では**機能しません**。これらを扱うには、まず変数に代入してください。

if @a.is_a?(String)
  # here @a is not guaranteed to be a String
end

a = @a
if a.is_a?(String)
  # here a is guaranteed to be a String
end

# A bit shorter:
if (a = @a).is_a?(String)
  # here a is guaranteed to be a String
end