vectores vacio metodos listas español elementos ejemplos data crear contar bidimensionales arreglos array ruby

ruby - vacio - ¿Por qué todo. devuelve true en una matriz vacía?



metodos de array en ruby (10)

Usando Ruby, quiero evaluar todos los elementos de una matriz y devolver el valor verdadero si todos pasan una prueba condicional.

Puedo hacer esto usando, por ejemplo, array.all? { |value| value == 2 } array.all? { |value| value == 2 }

Asi que:

> array=[2,2] > array.all? { |value| value == 2 } => true > array=[2,3] > array.all? { |value| value == 2 } => false

¡Genial!

Pero, ¿por qué una matriz vacía pasa esta prueba?

> array=[] > array.all? { |value| value == 2 } => true

¿No debería esto ser falso?

Y si lo necesito para devolver falso, ¿cómo debo modificar el método?


¿La fuente de todo? El método dice que usa la variable estática (que inicialmente se establece en verdadero) y luego realiza la operación AND entre el valor de la variable estática y el resultado de la iteración finalmente devuelve esta variable estática como resultado.

como la matriz está vacía ruby ​​nunca iterará en esta matriz vacía y como resultado de todo esto? método devolverá la variable estática que se estableció en verdadero.


Asegúrese de que la matriz no esté vacía primero. Entonces:

array.compact.present? && array.all? {|x| x != 2}


Como escribe Amit Kumar Gupta, es la interpretación estándar de la cuantificación universal. No tengo idea de por qué esperas que sea false . Aquí, puedes ver que debería ser true por inferencia.

La cuantificación universal es equivalente a la conjunción, por lo tanto ("<=>" significa equivalente):

"for all x in [a, b, c], P(x)" <=> "P(a) and P(b) and P(c)"

Tenga en cuenta que cualquier proposición es equivalente a la conjunción de verdadero y sí mismo, por lo tanto:

"for all x in [a, b, c], P(x)" <=> "true and P(a) and P(b) and P(c)"

Si reduce los elementos del conjunto a dos, obtendrá:

"for all x in [a, b], P(x)" <=> "true and P(a) and P(b)"

y más allá de un elemento:

"for all x in [a], P(x)" <=> "true and P(a)"

Ahora, ¿qué pasa con el conjunto vacío? Naturalmente,

"for all x in [], P(x)" <=> "true" Al notar que la cuantificación existencial es equivalente a la disyunción, también puede ver que debe esperar false con la cuantificación existencial sobre un conjunto vacío.


Dado que no hay ningún elemento en la matriz que FALLA en esa prueba, devuelve verdadero. Así que usa algo como:

array.size > 0 and array.all? { |value| value == 2}

O algo así.


En Ruby, nunca puedes hacer un loop sobre una colección vacía (matriz, hashes, etc.), por lo que en tu caso tu bloque nunca se ejecuta. ¿Y si el bloque nunca se ejecuta, all? devuelve verdadero (no hay ninguna condición para que el resultado sea falso).

Leer sobre all? En la documentación de Ruby .

Simplemente puede lograr su objetivo por

!array.empty? && array.all? { |value| value == 2 }


Esta es una verdad vacía . Es la interpretación estándar de una cuantificación universal, es decir, una

collection.all? { |x| some_predicate(x) }

sobre una collection vacía, pero se sabe que las personas son poco intuitivas cuando la ven por primera vez en un entorno formal. Una buena manera de pensar acerca de por qué esta es la semántica preferida es pensar en cómo implementaría all? .

Para hacer su prueba requiere que la matriz no esté vacía, solo haga

array.any? && array.all? { |x| x == 2 }

Tenga en cuenta que array.any? es rápido no importa el tamaño de la matriz, mientras que array.all? { |x| x == 2 } array.all? { |x| x == 2 } array.all? { |x| x == 2 } puede ser lento, dependiendo de cuán grande sea la array y lo raro que sea 2 . Así que pon el array.any? primero.

También tenga en cuenta que hay casos degenerados en los que esto no funcionará, por ejemplo, si la array es [nil] o [false] . Si surgen casos como este, reemplace array.any? con array.any? { true } array.any? { true } .


La documentación dice: " El método devuelve verdadero si el bloque nunca devuelve falso o nulo ... " En el caso de una matriz vacía, el bloque nunca se ejecuta y, por lo tanto, el método siempre devolverá true . En lo que se refiere a devolver false , tendrás que arr.empty?


Los ceros, las colecciones vacías, las matrices vacías y demás siempre han sido un poco especiales, si no totalmente problemáticas. Los griegos sabían bien por qué no contaban 0 entre los enteros naturales.

¿Método all? sería el primero en preguntarte "¿por qué me llamas en una matriz vacía?" ¿Qué quiere decir con "todo", cuando no hay nada allí? Eso es una contradicción. Y el método hace reflexiones breves y respuestas true por las razones descritas en las otras tres respuestas. Recuerde, usted tiene la culpa de hablar de "todos los elementos" de una matriz vacía, para empezar.


No hay ningún elemento en esa matriz que no pase la prueba. Creo que es posible que deba hacer una prueba para la longitud de la matriz.


Solo vamos

!(array.empty? || array.any? {|x| x != 2})

(Lo que tiene la ventaja adicional de fallar rápido, es decir, se puede evaluar correctamente sin tener que escanear toda la matriz).