Dada una matriz, un solo elemento o nulo, obtenga una matriz; los dos últimos son una matriz de un solo elemento y una matriz vacía, respectivamente.
Pensé erróneamente que Ruby funcionaría de esta manera:
[1,2,3].to_a #= [1,2,3] # Already an array, so no change
1.to_a #= [1] # Creates an array and adds element
nil.to_a #= [] # Creates empty array
Pero lo que realmente obtienes es:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Entonces, para resolver esto, necesito usar otro método, o podría programar un meta modificando el método to_a de todas las clases que pretendo usar, lo cual no es una opción para mí.
Entonces un método es:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
El problema es que está un poco desordenado. ¿Existe una forma elegante de hacer esto? (Me sorprendería si esta es la forma Ruby-ish de resolver este problema)
¿Qué aplicaciones tiene esto? ¿Por qué incluso convertir a una matriz?
En ActiveRecord de Rails, llamar a say, user.posts
devolverá una matriz de publicaciones, una sola publicación o nil. Al escribir métodos que funcionan con los resultados de esto, es más fácil asumir que el método tomará una matriz, que puede tener cero, uno o muchos elementos. Método de ejemplo:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
lugar de =
, ¿verdad?
[1,2,3].to_a
no no volver [[1,2,3]]
! Vuelve [1,2,3]
.
user.posts
nunca debe devolver una sola publicación. Al menos, nunca lo vi.