Qu’est-ce qu’une manière simple / élégante dans Ruby de dire si une variable particulière est un Hash ou un Array?

Pour vérifier ce qu’est @some_var , je fais un

 if @some_var.class.to_s == 'Hash' 

Je suis sûr qu’il existe un moyen plus élégant de vérifier si @some_var est un Hash ou un Array .

Vous pouvez juste faire:

 @some_var.class == Hash 

ou aussi quelque chose comme:

 @some_var.is_a?(Hash) 

Il est à noter que le “is_a?” La méthode est vraie si la classe est n’importe où dans l’arborescence des objects. par exemple:

 @some_var.is_a?(Object) # => true 

Ce qui précède est vrai si @some_var est une instance d’un hachage ou d’une autre classe issue de Object. Donc, si vous voulez une correspondance ssortingcte sur le type de classe, en utilisant le == ou l’instance_of? La méthode est probablement ce que vous recherchez.

Tout d’abord, la meilleure réponse à la question littérale est

 Hash === @some_var 

Mais la question aurait vraiment dû être résolue en montrant comment faire du dactylographie ici. Cela dépend un peu du type de canard dont vous avez besoin.

 @some_var.respond_to?(:each_pair) 

ou

 @some_var.respond_to?(:has_key?) 

ou même

 @some_var.respond_to?(:to_hash) 

peut être juste selon l’application.

Habituellement, en ruby, lorsque vous recherchez “type”, vous voulez réellement le “type de canard” ou “est-ce que le charlatan est un canard?”. Vous verriez si elle répond à une certaine méthode:

 @some_var.respond_to?(:each) 

Vous pouvez parcourir @some_var car il répond à: chaque

Si vous voulez vraiment connaître le type et si c’est Hash ou Array, vous pouvez faire:

 ["Hash", "Array"].include?(@some_var.class) #=> check both through instance class @some_var.kind_of?(Hash) #=> to check each at once @some_var.is_a?(Array) #=> same as kind_of 
 Hash === @some_var #=> return Boolean 

cela peut également être utilisé avec une déclaration de cas

 case @some_var when Hash ... when Array ... end 

J’utilise ceci:

 @var.respond_to?(:keys) 

Cela fonctionne pour Hash et ActiveSupport :: HashWithIndifferentAccess.

Vous pouvez utiliser instance_of?

par exemple

 @some_var.instance_of?(Hash) 

En pratique, vous voudrez souvent agir différemment selon que la variable est un tableau ou un hachage, et pas seulement un mot. Dans cette situation, un idiome élégant est le suivant:

 case item when Array #do something when Hash #do something else end 

Notez que vous n’appelez pas la méthode .class sur l’ item .

Si vous voulez tester si un object est ssortingctement ou étend un Hash , utilisez:

 value = {} value.is_a?(Hash) || value.is_a?(Array) #=> true 

Mais pour valoriser le typage de canard de Ruby, vous pouvez faire quelque chose comme:

 value = {} value.respond_to?(:[]) #=> true 

C’est utile quand vous voulez seulement accéder à une valeur en utilisant la syntaxe value[:key] .

Veuillez noter que Array.new["key"] TypeError une TypeError .

 irb(main):005:0> {}.class => Hash irb(main):006:0> [].class => Array