Ruby find_all vs select, quel est le problème ?

Il y a un mois, je ne connaissais absolument rien au langage de programmation Ruby. Je venais de passer un entretien en utilisant Javascript pour Flatiron School où ils enseignent à la fois Javascript ET Ruby. Avance rapide jusqu’à maintenant, je ne peux pas m’en passer !

Etre accepté à Flatiron School n’était que le début. Cent heures de travail préliminaire sur Ruby ont suivi peu après, où nous avons appris des tonnes de méthodes Ruby dont nous aurions besoin pour construire des applications fonctionnelles.

Parmi ces méthodes en Ruby, find_all et select se sont démarquées pour moi parce qu’elles semblaient accomplir la même chose. Les recherches initiales m’ont conduit à trouver…

find_all

select

Attendez, ne sont-elles pas identiques !?

Eh bien, en quelque sorte. Une plongée plus profonde dans les docs Ruby m’a conduit à découvrir qu’il y a un peu plus sous le capot.

Un objet est énumérable s’il décrit un ensemble d’éléments et une méthode pour boucler sur chacun d’eux. En Ruby, Enumerable#find_all et Enumerable#select constituent le même code. Les tableaux en Ruby héritent de Enumerable, donc exécuter find_all ou select sur un tableau en Ruby donnera le même résultat.

Mais cela commence à se compliquer lorsque vous bouclez sur un hachage. Un hash est une collection de paires clé-valeur. Si vous êtes plus familier avec Javascript, un hash en Ruby est comme un objet en Javascript.

**Sur un hash, find_all renvoie un tableau**

hash = {a: 1, b: 2, c: 3, d: 4}hash.find_all do |key, value|
value.odd?
end#would return , ] because the find_all method is #inherited from Enumerable

**Sur un hash, select renvoie un hash au lieu d’un tableau**

hash = {a: 1, b: 2, c: 3, d: 4}hash.select do |key, value|
value.odd?
end#would return {a:1, c:3}

Alors pourquoi find_all et select donnent des résultats différents lorsqu’ils sont exécutés sur un hash ? Avec un Hash, find_all hérite toujours de Enumerable mais select est redéfini pour retourner un Hash au lieu d’un Array. Une différence subtile mais importante !

Morale de l’histoire, pensez à ce que vous voulez retourner lorsque vous utilisez select ou find_all (et vraiment toute méthode en génie logiciel) avant de l’utiliser !

Yay, nous l’avons fait !

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.