Étant donné un tableau, un seul élément, ou nil, obtient un tableau - les deux derniers étant respectivement un tableau à un seul élément 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 est :
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Pour résoudre ce problème, je dois donc soit utiliser une autre méthode, soit métaprogrammer 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.
C'est donc une Méthode :
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Le problème, c'est que c'est un peu le bazar. Existe-t-il une manière élégante de procéder ? (Je serais étonné si c'était la façon Ruby-ish de résoudre ce problème).
Quelles sont les applications ? Pourquoi même convertir en tableau ?
Dans ActiveRecord de Rails, l'appel dit, user.posts
retournera soit un tableau de messages, un seul message, ou nil. Lorsque vous écrivez des méthodes qui travaillent sur les résultats de cette méthode, 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)}