Biorąc pod uwagę tablicę, pojedynczy element lub nil, uzyskaj tablicę - dwie ostatnie są odpowiednio tablicą jednoelementową i pustą.
Pomyłkowo pomyślałem, że Ruby będzie działać w ten sposób:
[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
Ale tak naprawdę otrzymujesz:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Aby rozwiązać ten problem, muszę albo użyć innej metody, albo metaprogram, modyfikując metodę to_a wszystkich klas, których zamierzam użyć - co nie jest dla mnie opcją.
Oto metoda:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Problem w tym, że jest trochę bałaganu. Czy jest na to elegancki sposób? (Byłbym zdziwiony, gdyby to był Rubinowy sposób rozwiązania tego problemu)
Jakie to ma aplikacje? Po co w ogóle konwertować na tablicę?
W ActiveRecord Railsów, wywołanie say, user.postszwróci albo tablicę postów, pojedynczy post, albo zero. Pisząc metody, które działają na wynikach tego, najłatwiej jest założyć, że metoda przyjmie tablicę, która może mieć zero, jeden lub wiele elementów. Przykładowa metoda:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==zamiast =, prawda?
[1,2,3].to_aczy nie wrócić [[1,2,3]]! Wraca [1,2,3].
user.postsnigdy nie powinien zwracać ani jednej wiadomości. Przynajmniej nigdy tego nie widziałem.