Dato un array, un singolo elemento o nil, ottieni un array: gli ultimi due sono rispettivamente un array a singolo elemento e un array vuoto.
Ho erroneamente pensato che Ruby avrebbe funzionato in questo modo:
[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
Ma quello che ottieni davvero è:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Quindi, per risolvere questo problema, ho bisogno di utilizzare un altro metodo, oppure posso meta-programmare modificando il metodo to_a di tutte le classi che intendo utilizzare, il che non è un'opzione per me.
Quindi un metodo è:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Il problema è che è un po 'un casino. C'è un modo elegante per farlo? (Sarei stupito se questo fosse il modo rubino per risolvere questo problema)
Quali applicazioni ha questo? Perché anche convertire in un array?
Nell'ActiveRecord di Rails, la chiamata, ad esempio, user.posts
restituirà un array di post, un singolo post o nil. Quando si scrivono metodi che funzionano sui risultati di ciò, è più facile presumere che il metodo richieda un array, che può avere zero, uno o molti elementi. Metodo di esempio:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
invece di =
, giusto?
[1,2,3].to_a
non non tornare [[1,2,3]]
! Ritorna [1,2,3]
.
user.posts
non dovrebbe mai restituire un singolo messaggio. Almeno, non l'ho mai visto.