Учитывая массив, единственный элемент или 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
никогда не должен возвращать ни одного сообщения. По крайней мере, я этого не видел.