Étant donné un tableau, un seul élément ou nil, obtenez un tableau - les deux derniers étant respectivement un tableau d'élément unique et un tableau vide.
J'ai pensé à tort que Ruby fonctionnerait de cette façon:
[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
Mais ce que vous obtenez vraiment, c'est:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Donc, pour résoudre cela, je dois soit utiliser une autre méthode, soit je pourrais utiliser un méta-programme en modifiant la méthode to_a de toutes les classes que j'ai l'intention d'utiliser - ce qui n'est pas une option pour moi.
Donc une méthode c'est:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Le problème est que c'est un peu le bordel. Y a-t-il une manière élégante de faire cela? (Je serais étonné si c'est la façon rubis de résoudre ce problème)
Quelles applications cela a-t-il? Pourquoi même convertir en un tableau?
Dans ActiveRecord de Rails, appeler par exemple user.posts
renverra un tableau de messages, un seul article ou nil. Lors de l'écriture de méthodes qui fonctionnent sur les résultats de ceci, il est plus facile de supposer que la méthode prendra un tableau, qui peut avoir zéro, un ou plusieurs éléments. Exemple de méthode:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
au lieu de =
, non?
[1,2,3].to_a
ne revient pas[[1,2,3]]
! Il revient [1,2,3]
.
user.posts
ne devrait jamais renvoyer un seul message. Au moins, je ne l'ai jamais vu.