Pour Ruby et Rails, une excellente documentation de référence est disponible (Ruby doc, Rails doc, ou d'autres alternatives comme APIdock, ou le récent omniref couvrant également la documentation de toutes les gemmes). Mais lorsque tu cherches comment vérifier qu'un tableau (Array) contient tous les éléments d'un autre, tu ne trouveras pas facilement la réponse dans la doc par ce qu'elle n'est pas orientée par cas d'usage. La documentation explique ce que chaque élément peut faire, pas comment tu peux l'utiliser (et certainement pas lequel tu devrais utiliser dans tel cas de figure). Il en est de même pour les livres et autres tutoriels, mais heureusement il y a StackOverflow. Ci-dessous je partage 7 cas d'usage commun d'un tableau (Array) que j'ai rencontré souvent et qui devrait t'être utile.

1. Comment vérifier si un tableau contient tous les élément d'un autre ?

Tu souhaites vérifier que tous les emails que tu importes existent dans une liste de contact.

imported_emails = [ 'john@doe.com', 'janet@doe.com' ]
existing_emails = [ 'john@doe.com', 'janet@doe.com' , 'fred@mercury.com' ]

puts 'already imported' if (imported_emails - existing_emails).empty?

Résultat IRB :

already imported
=> nil

Référence : Array Difference

2. Comment trouver quels éléments sont communs à deux tableaux ?

Tu souhaites trouver les tags communs à deux articles de blog.

tags_post1 = [ 'ruby', 'rails', 'test' ]
tags_post2 = [ 'test', 'rspec' ]

common_tags = tags_post1 & tags_post2

Résultat IRB :

 => ["test"]

Référence : Set Intersection

3. Comment fusionner deux tableaux sans créer de doublon ?

Tu souhaites obtenir une liste unique d'ID de comptes Twitter suivis par deux personnes.

followeds1 = [ 1, 2, 3 ]
followeds2 = [ 2, 4, 5 ]

all_followeds =  followeds1 | followeds2

Résultat IRB :

 => [1, 2, 3, 4, 5]

Référence : Set Union

4. Comment trier un tableau de tables de hachage (Hash) ?

Tu récupères des données d'une API tiers qui retournent un tableau de table de hachage (Hash) comme par exemple :

data = [
 {
    name: 'Christophe',
    location: 'Belgium'
 },
 {
    name: 'John',
    location: 'United States of America'
 },
 {
    name: 'Piet',
    location: 'Belgium'
 },
 {
    name: 'François',
    location: 'France'
 }
]

Lors de l'affichage de ces données, tu souhaites les trier par lieu. Tu peux le faire avec :

data.sort_by { |hsh| hsh[:location] }

Résultat IRB :

 => [
     {:name=>"Christophe", :location=>"Belgium"},
     {:name=>"Piet", :location=>"Belgium"},
     {:name=>"François", :location=>"France"},
     {:name=>"John", :location=>"United States of America"}
    ]

Référence : Enumerable#sort_by

5. Comment ne garder que les objets dans un tableau qui sont uniques selon l'un de leur attribut ?

Dans un magasin en ligne, on la page principale, tu as besoin de ne montrer qu'un seul produit par catégorie.

Product = Struct.new(:id, :category_id)

products = [
 Product.new(1, 1),
 Product.new(2, 2),
 Product.new(3, 3),
 Product.new(4, 1),
 Product.new(5, 3),
 Product.new(6, 5),
]

products = products.uniq &:category_id

Résultat IRB :

 => [
     #<struct Product id=1, category_id=1>,
     #<struct Product id=2, category_id=2>,
     #<struct Product id=3, category_id=3>,
     #<struct Product id=6, category_id=5>
    ]

Référence : Array#uniq

6. Comment filtrer un tableau avec une chaîne de caractère (String) ?

Tu as récupéré une liste de livres et tu souhaites les filtrer avec une chaîne de caractère :

books = [
 'The Ruby Programming Language',
 'Programming Ruby 1.9 & 2.0: The Pragmatic Programmers' Guide (The Facets of Ruby)',
 'Practical Object-Oriented Design in Ruby: An Agile Primer',
 'Eloquent Ruby',
 'Ruby on Rails Tutorial: Learn Web Development with Rails'
]

books = books.grep(/[Rr]ails/)

Résultat IRB :

 => ["Ruby on Rails Tutorial: Learn Web Development with Rails"]

Référence : Enumerable#grep

7. Comment toujours récupérer un tableau ?

Dans une méthode tu manipules des produits. A la fin de la méthode tu en retournes un ou plusieurs. Mais lorsque tu n'en récupères qu'un, ce n'est pas un tableau. Tu peux traiter les deux cas de manière très élégante avec Array() or [*]:

def method
 # …

 [*products]
end

Tu trouveras de plus amples détails sur cette méthode dans l'article de Bozhidar.

Référence : Kernel#Array, splat operator, Ruby Style guide

Et toi ? Quels sont tes cas d'usage quotidien d'un tableau ?

Ruby est plein de trésors. Il prend un certain temps de les connaître et de les trouver. Quels sont les tiens ? Quel est ton cas d'usage typique d'un tableau et l'élégant code Ruby qui l'implémente ?