跳至内容

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? 测试,例如抽象类和模块。

以上也适用于条件中存在与 (&&) 的情况。

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