Ruby find_all vs select, ¿cuál es el problema?

Hace un mes no sabía absolutamente nada sobre el lenguaje de programación Ruby. Acababa de hacer una entrevista usando Javascript para Flatiron School donde enseñan tanto Javascript como Ruby. Ahora no me canso de verlo…

Conseguir que me aceptaran en Flatiron School fue sólo el principio. Cien horas de trabajo previo de Ruby siguieron poco a poco donde aprendimos toneladas de métodos de Ruby que necesitaríamos para construir aplicaciones funcionales.

De estos métodos en Ruby, find_all y select se destacaron para mí porque parecían lograr la misma cosa. La investigación inicial me llevó a encontrar…

find_all

select

Espera, ¿no son idénticos?

Bueno, más o menos. Una inmersión más profunda en los documentos de Ruby me llevó a descubrir que hay un poco más bajo el capó.

Un objeto es enumerable si describe un conjunto de elementos y un método para hacer un bucle sobre cada uno de ellos. En Ruby, Enumerable#find_all y Enumerable#select son el mismo código. Los Arrays en Ruby heredan de Enumerable, por lo que ejecutar find_all o select en un Array en Ruby dará el mismo resultado.

Pero empieza a complicarse cuando se hace un bucle sobre un hash. Un hash es una colección de pares clave-valor. Si estás más familiarizado con Javascript, un hash en Ruby es como un objeto en Javascript.

**Sobre un hash, find_all devuelve un array**

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

**Sobre un hash, select devuelve un hash en lugar de un array**

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

¿Por qué find_all y select dan resultados diferentes cuando se ejecutan sobre un hash? Con un Hash, find_all sigue heredando de Enumerable pero select se redefine para devolver un Hash en lugar de un Array. Sutil pero importante diferencia!

Moral de la historia, piensa en lo que quieres devolver cuando usas select o find_all (y realmente cualquier método en ingeniería de software) antes de usarlo!

¡Sí, lo hicimos!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.