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::Kernel
y 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::Set
de stdlib y::ActiveRecord::Relation
de rieles). Por:nil?
lo tanto, está disponible en todas las subclases::Object
y también en cada clase que incluye::Kernel
por sí misma, donde:empty?
debe implementarse o incluirse específicamente en sus clases.nil
concepto, comience aquí .[1] pry(main)> [].blank? => true
Respuestas:
.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áfalse
incluso 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? == true
presence
!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!!false
Una 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átrue
a 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 something
ounless something
luego 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 devuelvetrue
si 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 devuelvetrue
si estos objetos no contienen ningún elemento:empty?
no se puede invocar ennil
objetos.blank?
es un método Rails que se puede invocar tanto ennil
objetos 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 rendimientostrue
si los valores no están disponibles y rendimientosfalse
si 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 booleanostrue
ofalse
.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