¿Cuál es la forma correcta de:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
o para obtener el recuento de elementos en él?
¿Cuál es la forma correcta de:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
o para obtener el recuento de elementos en él?
Respuestas:
Probablemente quieras usar kind_of()
.
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
kind_of?()
sobre otras soluciones? Alguna explicación sobre los beneficios de su respuesta sobre otros sería útil para futuros lectores.
¿Estás seguro de que debe ser una matriz? Es posible que pueda usarlo respond_to?(method)
para que su código funcione para cosas similares que no son necesariamente matrices (tal vez alguna otra cosa numerable). Si realmente necesita un array
, entonces la publicación que describe el Array#kind\_of?
método es la mejor.
['hello'].respond_to?('each')
respond_to?(:to_ary)
.
En lugar de probar un Array,
solo convertir lo que obtienes en un nivel, Array,
por lo que tu código solo necesita manejar un caso.
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Ruby tiene varias formas de armonizar una API que puede tomar un objeto o una matriz de objetos, por lo tanto, adivina por qué quieres saber si algo es una matriz, tengo una sugerencia.
El operador splat contiene mucha magia que puede buscar, o simplemente puede llamar Array(something)
para agregar un contenedor de matriz si es necesario. Es similar a [*something]
en este caso.
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
O bien, puede usar el símbolo splat en la declaración de parámetros y .flatten
, luego , darle un tipo diferente de recopilador. (Para el caso, también puede llamar .flatten
arriba).
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]"
Y, gracias gregschlom , a veces es más rápido simplemente usarlo Array(x)
porque cuando ya es un Array
no necesita crear un nuevo objeto.
[*nil] => []
. Entonces podrías terminar con una matriz vacía.
Array(foo)
es mucho más eficiente que[*foo]
[1,2,3].is_a? Array
se evalúa como verdadero
is_a?
en todo este hilo. Lo más cercano es a [1,2,3].is_a? Enumerable
. Todavía creo que vale la pena tener esta respuesta.
Parece que buscas algo que tiene algún concepto de elementos. Por lo tanto, recomiendo ver si es así Enumerable
. Eso también garantiza la existencia de#count
.
Por ejemplo,
[1,2,3].is_a? Enumerable
[1,2,3].count
en cuenta que, si bien size
, length
y count
todo el trabajo para las matrices, count
es el significado aquí - (por ejemplo, 'abc'.length
y 'abc'.size
tanto trabajo, pero 'abc'.count
no funciona de esa manera).
Precaución: una cadena es_a? Enumerable, entonces quizás esto no sea lo que quieres ... depende de tu concepto de una matriz como objeto.
Tratar:
def is_array(a)
a.class == Array
end
EDITAR : La otra respuesta es mucho mejor que la mía.
También considere usar Array()
. De la Guía de estilo de comunidad de Ruby :
Use Array () en lugar de la verificación explícita de Array o [* var], cuando trate con una variable que desea tratar como Array, pero no está seguro de que sea una matriz.
# bad
paths = [paths] unless paths.is_a? Array
paths.each { |path| do_something(path) }
# bad (always creates a new Array instance)
[*paths].each { |path| do_something(path) }
# good (and a bit more readable)
Array(paths).each { |path| do_something(path) }
to_a
se invoca en cada argumento agregado a la nueva matriz, por lo que Array({id: 100})
regresa[[:id, 100]]