Учитывая массив, единственный элемент или nil, получить массив - последние два являются массивом с одним элементом и пустым массивом соответственно.
Я ошибочно подумал, что Ruby будет работать следующим образом:
[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
Но что вы действительно получите:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Итак, чтобы решить эту проблему, мне либо нужно использовать другой метод, либо я мог бы использовать метапрограмму, изменив метод to_a всех классов, которые я собираюсь использовать, что для меня не вариант.
Итак, это метод:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
Проблема в том, что это немного беспорядок. Есть ли элегантный способ сделать это? (Я был бы удивлен, если бы это был способ решения этой проблемы в стиле Ruby)
Какие приложения у этого есть? Зачем вообще преобразовывать в массив?
В ActiveRecord Rails вызов, скажем, user.postsбудет либо возвращать массив сообщений, либо одну запись, либо ноль. При написании методов, которые работают с результатами этого, проще всего предположить, что метод будет принимать массив, который может иметь ноль, один или несколько элементов. Пример метода:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==а не =, не так ли?
[1,2,3].to_aвовсе не вернется [[1,2,3]]! Он возвращается [1,2,3].
user.postsникогда не должен возвращать ни одного сообщения. По крайней мере, я этого не видел.