Hola, les saluda Luis y hoy les traigo otro nuevo post.
Comencemos revisando el enumerable ‘.sort’.
# In case you didn't know, .sort == .sort a, b # using .sort enumerable numbers_array = [2,1,3,5,4] numbers_array.Sort #=> [1,2,3,4,5] alphabet_array = ["b", "c", "a"] alphabet_array.sort #=> ["a","b","c"]
Como se muestra arriba, el enumerable ‘.sort’ toma una matriz y por defecto ordena la matriz usando ‘<=>’ (operador de nave espacial). Sin embargo, puede ser específico sobre cómo desea ordenar la matriz. Por ejemplo, si desea ordenar la matriz de números de mayor a menor en lugar de menor a mayor, debería hacer:
numbers_array.sort #=> [5,4,3,2,1]
Entonces, ahora que hemos repasado cómo funciona el enumerable ‘.sort’ tradicional, analicemos cuándo y por qué ‘.sort_by’ es mejor en muchos casos.
Similar a ‘.sort’, el enumerable ‘.sort_by’ ordenará una matriz. Sin embargo, difiere en un par de formas. Echemos un vistazo a cómo ordenaría una matriz de cadenas por la longitud de la cadena usando ‘.sort’ y ‘.sort_by’
string_array = ["yesterday", "now", "today"] #example using .sort string_array.sort a, b string_array #=> ["now", "today", "yesterday"] #example using .sort_by string_array.sort_by string_array #=> ["now", "today", "yesterday"]
La primera diferencia notable entre los dos es que el ‘.sort’ requiere dos parámetros en su bloque, mientras que el bloque ‘sort_by’ solo toma uno.
La segunda diferencia no es tan clara, sin embargo, es mucho más importante. El enumerable ‘.sort’ toma y compara los parámetros, comparación por comparación en toda la longitud de la matriz. Mientras tanto, ‘.sort_by’ toma el parámetro único y lo ordena usando un método similar a la «Transformada de Schwartzian» (si desea saber más sobre cómo funciona la Transformada de Schwartzian, he proporcionado este enlace con recursos muy útiles que detallan el tema). En pocas palabras, en el enumerable ‘.sort_by’, la comparación se realiza una vez al principio, mientras que, como en el ‘.sort’, la comparación se calcula para cada comparación entre los parámetros.
¿Por qué importa esto? Bueno, normalmente no hace mucha diferencia. Sin embargo, cuando se trabaja con matrices extensas, la diferencia de rendimiento puede ser bastante sustancial. Es por eso que prefiero usar el enumerable ‘.sort_by’ cuando sea apropiado (también el código me parece más limpio).
Solo para tener más claridad sobre cómo usar ‘.sort_by’, aquí hay un ejemplo de cómo se puede usar para clasificar personas (que son objetos de instancia de la clase Person) en una matriz por su edad (uno de sus atributos)
person_array = [bob, george, donna] #bob.age = 39 #george.age = 47 #donna.age = 22 #sort by age using .sort_by person_array.sort_by #=> [donna, bob, george]
Gracias por leer.
Añadir comentario