Découvrez quelques facettes cachées du Ruby avec cette série d'articles, et devenez un vrai développeur ninja.
Pour ce second article, nous allons nous pencher sur les différents aspects des Hash et des Array.

Introduction

Pour bien commencer, présentons les protagonistes.

Les tableaux sont semblables aux tableaux de presque tous les langages et s'écrivent comme suit :

tab = ["bonjour", "hello", "hola"]

On accède au contenu de la même manière que pour les autres langages aussi :

tab[1] #=> "hello"

Les Hash sont des tableaux associatifs. Certains langages ne font pas de différence entre les tableaux indexées et les associatifs, mais Ruby si. Ils se créent de cette façon : hash = {:fr => “bonjour”, :en => “hello”, :es => “hola”}. Là aussi, on accède au contenu de manière standard: hash[:fr] => “bonjour”

Maintenant que nous savons de quoi nous parlons, posons quelques petits trucs, connus ou pas, à propos des tableaux et des hash.

# Socle commun

## Se simplifier la vie sur irb

Avec Active Record et Rails, il vous est sûrement déjà arrivé de remplir l'écran/historique dans irb de l'affichage d'un tableau. Pour éviter ça, il est possible de modifier la méthode Array#inspect, pour lui faire afficher à la place uniquement le nombre d'éléments si il dépasse un certain seuil.

class Array
  alias inspect_old inspect
  def inspect
    if self.length > 10
      "[...#{self.length} elements...]"
    else
      inspect_old
    end
  end
end

 

Libre à vous d'étendre aux hash, ou de modifier, selon les besoins.

Il est aussi possible de convertir les Array et les hash (entre autre) en un affichage plus sympa simplement en les précédant e ‘y'. 

y {:fr => "bonjour", :en => "hello", :es => "hola"} 
#=>  
---   
:fr: bonjour
:en: hello 
:es: hola

# Les tableaux

## parcourir le tableau en sens inverse

Donner un index négatif au tableau permet de rechercher un objet depuis la fin du tableau et non le début. tab[-1] donnera donc le dernier élément du tableau.

  ["a", "b", "c", "d", "e", "f"][-2] #=> "e"

## Pré-remplir un tableau

Quand nous créons notre tableau depuis sa classe, il est possible de lui donner une taille de départ, voir de le pré-remplir.

Array.new(2) #=> [nil, nil]  
Array.new(2, "bonjour") #=> ["bonjour","bonjour"]Array.new(4){|i| "ce texte est à l'index #{i}"}

## Insérer un objet dans un tableau

Comme dans beaucoup de langage, << est un alias de push.

tab = [] #=> []tab << "mon objet" #=>["mon objet"]

# Les hash

## Une nouvelle façon d'écrire nos hash.

Depuis Ruby 1.9, il est possible d'écrire ce hash:  

{:fr => "bonjour", :en => "hello", :es => "hola"}

comme cela, comme en Javascript.  

{fr:"bonjour", en:"hello", es:"hola"}

(les clés seront des symboles, et non des string comme en js, par contre)

## Donner un comportement par défaut en cas d'absence de la clé recherchée

À la création, les Hash peuvent accepter un block, qui vas définir le comportement en cas de clé manquante. 

hash = Hash.new{|h, k| ... } # Le h est le hash lui même, et k la clé demandée.

De cette manière, nous pouvons définir un retour d'erreur personnalisé, un failback vers une valeur par défaut, ou bien des choses étonnantes comme une nouvelle façon d'écrire des dates, ou encore un cache pour données web ! (pour ces derniers exemples, je vous recommande cet excellent article. Lisez les commentaires aussi, ils sont vraiment intéressants).

 #Conclusion

Ces quelques astuces ne vous permettrons pas de briller en société (quoi que…), et vous connaissiez certainement la plupart, ils font partie des fonctions “de base” des Array et des Hash. Ils sont donc d'autant plus importants à bien maîtriser, car leur utilisation sera souvent naturelle, donc pas forcément commentée.