2016-03-10 3 views
1

Действительно простой вопрос.Преобразование массива в один объект, если массив является единственным объектом

Есть ли способ сделать следующее?

["a"] => "a" 
[1] => 1 
[1,"a"] => [1, "a"] 

i.e Если массив является единственным объектом, верните объект, в противном случае верните массив. Без делать что-то уродливое, как

array.length == 1 ? array[0] : array 
+3

Насколько мне известно, - но почему вы хотите это сделать? Независимо от того, что вы передаете этим данным, следует реагировать либо на массив, либо на строку, выбирая одно значение, если оно само по себе означает, что ваш код дальше должен знать, как обращаться с массивами и строками, а не просто полагаться на n всегда имеющий массив. –

+4

Возможный дубликат [Есть ли рубиновая идиома для возврата первого элемента массива, если существует только один?] (Http://stackoverflow.com/questions/20109800/is-there-a-ruby-idiom-for-returning- the-first-array-element-if-only-one-exists) – ndn

+0

У этого есть запах кода. – sawa

ответ

1

в основном вы должны придерживаться того, что вы написали - это просто и делает то, что он должен.

, конечно, вы можете всегда обезьяна патч определение массива ... (unrecommended, но это не то, что вы ожидаете)

class Array 
    def first_or_array 
    length > 1 ? self : self[0] 
    end 
end 

[1].first_or_array # 1 
[1, 2].first_or_array # [1, 2] 
+0

Именно это! Я собирался опубликовать то же самое. Но я бы добавил что-то. Это не исключает возможности иметь что-то вроде [[1,2]], а затем [[1,2]]. First_of_array = [1,2], все еще массив, хотя содержимое является единственным объектом (другим массивом). Это должно быть чем-то рекурсивным, если целью является достижение одного объекта. –

+2

Если вы не можете сделать лучше, чем OP, вы должны просто предложить OP, чтобы идти таким образом. Это должен быть ответ. Это может быть просто комментарий. – sawa

Смежные вопросы