Вместо проверки на Array,
просто конвертируйте все, что вы получаете, в одноуровневый Array,
, чтобы ваш код обрабатывал только один случай.
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
В Ruby есть различные способы гармонизации API, который может принимать объект или массив объектов, поэтому, догадываясь, почему вы хотите знать, является ли что-то массивом, у меня есть предложение.
Оператор splat содержит много магии , которую вы можете посмотреть, или вы можете просто позвонить Array(something)
, который добавит оболочку Array, если необходимо. Это похоже на [*something]
в этом одном случае.
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
Или вы можете использовать splat в объявлении параметра, а затем .flatten
, что даст вам другой тип сборщика. (В этом отношении, Вы могли бы также назвать .flatten
выше.)
def f *x
p x.flatten.inspect
end # => nil
f 1 # => "[1]"
f 1,2 # => "[1, 2]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
f [1,2],3,4 # => "[1, 2, 3, 4]"
И, спасибо gregschlom , иногда просто быстрее использовать Array(x)
, потому что когда это уже Array
, ему не нужно создавать новый объект.