Me encuentro en repetidas ocasiones en busca de una definición clara de las diferencias de nil?, blank?y empty?en Ruby on Rails. Aquí está lo más cerca que he estado:
blank?los objetos son falsos, vacíos o una cadena de espacio en blanco. Por ejemplo,""," ",nil,[], y{}están en blanco.nil?Los objetos son instancias de NilClass.empty?los objetos son específicos de la clase, y la definición varía de una clase a otra. Una cadena está vacía si no tiene caracteres, y una matriz está vacía si no contiene elementos.
¿Falta algo o se puede hacer una comparación más estricta?
ruby-on-rails
ruby
Arrel
fuente
fuente

present?. Lo cual se debe a queblank?devuelve verdadero para una matriz vacía.:nil?se define en::Kernely cambiados en::NilClass, mientras:empty?se implementa por separado en muchas clases (de forma nativa en::String,::Array,::Hash, y no de forma nativa en otras clases como::Setde stdlib y::ActiveRecord::Relationde rieles). Por:nil?lo tanto, está disponible en todas las subclases::Objecty también en cada clase que incluye::Kernelpor sí misma, donde:empty?debe implementarse o incluirse específicamente en sus clases.nilconcepto, comience aquí .[1] pry(main)> [].blank? => trueRespuestas:
.nil?se puede usar en cualquier objeto y es verdadero si el objeto es nulo..empty?se puede usar en cadenas, matrices y hashes y devuelve verdadero si:Correr
.empty?en algo que es nulo arrojará unNoMethodError.Ahí es donde
.blank?entra. Está implementado por Rails y funcionará en cualquier objeto, así como.empty?en cadenas, matrices y hashes..blank?también evalúa true en cadenas que no están vacías pero que solo contienen espacios en blanco:Rails también proporciona
.present?, lo que devuelve la negación de.blank?.Array gotcha:
blank?regresaráfalseincluso si todos los elementos de una matriz están en blanco. Para determinar el espacio en blanco en este caso, useall?conblank?, por ejemplo:fuente
false.blank? == truepresence!Hice esta útil tabla con todos los casos:
blank?,present?son proporcionados por Rails.fuente
any?si alguna vez actualiza la tabla.blank?ypresent?no son " solo Rails ", Rails los incluye automáticamente, pero se pueden incluir fácilmente en código que no sea Rails mediante las extensiones Core de ActiveSupport. Ver stackoverflow.com/questions/4238867/…Solo extienda la mesa de Julian:
Ref: vacío? En blanco? Nulo? 傻傻 分不清楚
fuente
Enumerable#any?es vainilla Ruby, no debería figurar en "solo rieles".zero?y.nonzero?Consejo rapido:
!obj.blank? == obj.present?Puede ser útil / más fácil para la vista en algunas expresiones
fuente
present?es parte de active_support, verifique aquí qué incluir para obtenerlo: stackoverflow.com/a/4648704/1569!!falseUna diferencia es que
.nil?y.empty?son métodos que proporciona el lenguaje de programación Ruby, mientras que.blank?es algo agregado por el marco de desarrollo web Rails.fuente
nil?esblank?empty?esblank?empty?esnil?nil?esempty?tl; dr: solo use
blank?& apresent?menos que desee distinguir entre""y" "fuente
Un caso especial es cuando se trata de evaluar si un valor booleano es nulo:
En este caso, la recomendación sería utilizar
.nil?fuente
Solo una pequeña nota sobre la
any?recomendación: tiene razón en que generalmente es equivalente a!empty?. Sin embargo,any?volverátruea una cadena de solo espacios en blanco (ala" ").Y, por supuesto, vea el comentario 1.9 anterior también.
fuente
No olvides
any?cuál es generalmente!empty?. En Rails, generalmente verifico la presencia de algo al final de una declaraciónif somethingounless somethingluego lo usoblank?cuando sea necesario, ya que parece funcionar en todas partes.fuente
any?control de no vacío. Devuelve falso si tiene una matriz de valores falsos. Una forma de evitarlo es pasar un bloqueo siempre verdadero:[nil, false].any?{ true }pero!empty?es más corto y no recuerdas el comportamiento extraño.nil?es un método estándar de Ruby que se puede invocar en todos los objetos y devuelvetruesi el objeto esnil:empty?es un método estándar de Ruby que se puede invocar en algunos objetos como Strings, Arrays y Hashes y devuelvetruesi estos objetos no contienen ningún elemento:empty?no se puede invocar ennilobjetos.blank?es un método Rails que se puede invocar tanto ennilobjetos como en objetos vacíos.fuente
Todos los demás han explicado bien cuál es la diferencia.
Me gustaría agregar Ruby On Rails, es mejor usar
obj.blank?o enobj.present?lugar deobj.nil?oobj.empty?.obj.blank?Sirve para todo tiponil,'',[],{}, y rendimientostruesi los valores no están disponibles y rendimientosfalsesi los valores están disponibles en cualquier tipo de objeto.fuente
exists?El método se puede utilizar para verificar si los datos existen en la base de datos o no. Devuelve valores booleanostrueofalse.fuente
Carriles 4
una alternativa a 'corray-brook' s 'Array gotcha: blank?' para verificar si una matriz solo contiene valores vacíos y puede considerarse en blanco? cierto:
uno también podría hacer:
fuente
nil?Se puede utilizar en cualquier objeto. Determina si el objeto tiene algún valor o no, incluidos los valores 'en blanco'.Por ejemplo:
Básicamente
nil?solo devolverá verdadero si el objeto es de hecho igual a 'nulo'.empty?solo se invoca en objetos que se consideran una colección. Esto incluye cosas como cadenas (una colección de caracteres), hashes (una colección de pares clave / valor) y matrices (una colección de objetos arbitrarios).empty?devuelve verdadero si no hay elementos en la colección.Por ejemplo:
Darse cuenta de
empty?no se puede invocar en objetos nulos ya que los objetos nulos no son una colección y generará una excepción.También tenga en cuenta que incluso si los elementos de una colección están en blanco, no significa que una colección esté vacía.
blank?es básicamente una combinación denil?yempty?es útil para verificar objetos que supones que son colecciones, pero también podrían ser nulos.fuente