if var.responds_to?(...)

Si une condition if est un test responds_to?, dans la branche then le type de la variable est assuré d'être restreint aux types auxquels répond la méthode:

if a.responds_to?(:abs)
  # ici le type de a sera réduit à ceux répondant à la méthode 'abs'
end

De plus, dans la branche else le type de la variable est assuré d'être restreint aux types qui ne répondent pas à la méthode:

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

if a.responds_to?(:abs)
  # ici a sera Int32, étant donné que Int32#abs existe et pas String#abs
else
  # ici a sera une String
end

Ce qui précède ne fonctionne pas avec les variables d'instance, les variables de classe ou les variables globales. Pour fonctionner avec, assignez-les à une variable:

if @a.responds_to?(:abs)
  # ici @a n'est pas assurée de répondre à `abs`
end

a = @a
if a.responds_to?(:abs)
  # ici a est assurée de répondre à `abs`
end

# Plus court:
if (a = @a).responds_to?(:abs)
  # ici a est assurée de répondre a `abs`
end

results matching ""

    No results matching ""