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