跳到內容

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