¿Es malo verificar si una matriz no está vacía mediante el any?
método?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
¿O es mejor usar unless a.empty?
?
any?
No es lo mismo que not empty?
en algunos casos.
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
De la documentación:
Si no se proporciona el bloque, Ruby agrega un bloque implícito de {| obj | obj} (¿es cualquier? devolverá verdadero si al menos uno de los miembros de la colección no es falso o nulo).
empty?
?present?
método de pago .#present?
es solo para Rails. En puro Ruby obtendrásNoMethodError: undefined method 'present?' for Array
.require 'activesupport'
.La diferencia entre una matriz que evalúa sus valores
true
o si está vacía.El método
empty?
proviene de la clase Arrayhttp://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
Se utiliza para verificar si la matriz contiene algo o no. Esto incluye cosas que evalúan a
false
, comonil
yfalse
.El método
any?
proviene del módulo Enumerable.http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
Se utiliza para evaluar si "cualquier" valor en la matriz se evalúa
true
. Métodos similares a esto sonnone?
,all?
yone?
, donde todos solo verifican para ver cuántas veces podría evaluarse la verdad. que no tiene nada que ver con el recuento de valores encontrados en una matriz.caso 1
caso 2
caso 3
fuente
Prefijar la declaración con un signo de exclamación le permitirá saber si la matriz no está vacía. Entonces en tu caso ...
fuente
Evitar
any?
para grandes matrices.any?
esO(n)
empty?
esO(1)
any?
no comprueba la longitud, pero en realidad escanea toda la matriz en busca de elementos verdaderos.empty?
por otro lado, solo verifica la longitud de la matriz.La diferencia es relevante si tiene matrices "dispersas" que comienzan con muchos
nil
valores, como por ejemplo una matriz que acaba de crearse.fuente
nil
valores, con matrices "normales"any?
sin retornos de bloque en el primer elemento, por lo que la complejidad sigue siendo O (1) como elempty?
métodoSugeriré usar
unless
yblank
para comprobar si está vacío o no.Ejemplo:
Esto sabrá 'a' vacío o no. Si 'a' está en blanco, el siguiente código no se ejecutará.
fuente
#blank?
Es parte de Rails. Si ya están usando Rails,#present?
es la negación de#blank?
todos modos.No creo que sea malo usarlo
any?
en absoluto. Lo uso mucho. Es claro y conciso.Sin embargo, si le preocupa que todos los
nil
valores lo descarten, entonces realmente está preguntando si la matriz lo ha hechosize > 0
. En ese caso, esta extensión simple (NO optimizada, estilo mono) te acercaría.Esto es bastante descriptivo, lógicamente preguntando "¿este objeto tiene un tamaño?". Y es conciso, y no requiere ActiveSupport. Y es fácil de construir.
Algunos extras para pensar:
present?
de ActiveSupport.String
, que ignora los espacios en blanco (como lopresent?
hace).length?
deString
u otros tipos donde podría ser más descriptivo.Integer
y otrosNumeric
tipos, de modo que se devuelva un cero lógicofalse
.fuente