Dada uma matriz, um único elemento ou nil, obtenha uma matriz - os dois últimos sendo uma matriz de elemento único e uma matriz vazia, respectivamente.
Achei por engano que Ruby funcionaria desta forma:
[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
Mas o que você realmente consegue é:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
Então, para resolver isso, eu preciso usar outro método ou poderia meta-programar modificando o método to_a de todas as classes que pretendo usar - o que não é uma opção para mim.
Portanto, é um método:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
O problema é que é uma bagunça. Existe uma maneira elegante de fazer isso? (Eu ficaria surpreso se esta for a maneira Ruby de resolver este problema)
Quais aplicativos isso tem? Por que até mesmo converter para um array?
No ActiveRecord do Rails, chamar, digamos, user.posts
retornará uma matriz de postagens, uma única postagem ou nil. Ao escrever métodos que funcionam nos resultados disso, é mais fácil assumir que o método terá um array, que pode ter zero, um ou muitos elementos. Método de exemplo:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
vez de =
, certo?
[1,2,3].to_a
se não voltar [[1,2,3]]
! Ele retorna [1,2,3]
.
user.posts
nunca deve retornar uma única postagem. Pelo menos, eu nunca vi isso.