Bei einem gegebenen Array erhält ein einzelnes Element oder Null ein Array - die beiden letzteren sind ein einzelnes Elementarray bzw. ein leeres Array.
Ich dachte fälschlicherweise, Ruby würde so funktionieren:
[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
Aber was Sie wirklich bekommen, ist:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Um dies zu lösen, muss ich entweder eine andere Methode verwenden oder ich kann ein Meta-Programm erstellen, indem ich die to_a-Methode aller Klassen ändere, die ich verwenden möchte - was für mich keine Option ist.
Also eine Methode ist es:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Das Problem ist, dass es ein bisschen chaotisch ist. Gibt es eine elegante Möglichkeit, dies zu tun? (Ich würde mich wundern, wenn dies der rubinrote Weg ist, um dieses Problem zu lösen.)
Welche Anwendungen hat das? Warum überhaupt in ein Array konvertieren?
In Rails 'ActiveRecord gibt der Aufruf von say user.posts
entweder ein Array von Posts, einen einzelnen Post oder null zurück. Wenn Sie Methoden schreiben, die an den Ergebnissen arbeiten, ist es am einfachsten anzunehmen, dass die Methode ein Array verwendet, das null, eins oder viele Elemente enthalten kann. Beispielmethode:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
statt =
, oder?
[1,2,3].to_a
kommt nicht zurück [[1,2,3]]
! Es kehrt zurück [1,2,3]
.
user.posts
sollte niemals einen einzelnen Beitrag zurückgeben. Zumindest habe ich es nie gesehen.