Давши масив, один елемент або нуль, отримайте масив - останні два являють собою масив одного елемента та порожній масив відповідно.
Я помилково вважав, що Рубі працює так:
[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))
Проблема в тому, що це трохи безлад. Чи є елегантний спосіб зробити це? (Я був би вражений, якщо це спосіб вирішити цю проблему)
Які програми це має? Чому навіть перетворити на масив?
У Rails 'ActiveRecord, зателефонувавши скажімо, 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
ніколи не повинні повертати жодної посади. Принаймні, я цього ніколи не бачив.