Una explicación concisa de nil v. Empty v. Blank en Ruby on Rails

Me encuentro en repetidas ocasiones buscando una definición clara de las diferencias de nil? blank? y empty? en Ruby on Rails. Aquí está lo más cerca que he venido:

¿Hay algo que falta, o una comparación más estricta que se puede hacer?

.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:

  • Longitud de cadena == 0
  • Longitud de matriz == 0
  • Longitud del hash == 0

¿Funcionando .empty? en algo que es nulo lanzará un NoMethodError .

Ahí es donde .blank? entra. Es implementado por Rails y operará en cualquier objeto además de funcionar como .empty? en cadenas, matrices y hash.

 nil.blank? == true false.blank? == true [].blank? == true {}.blank? == true "".blank? == true 5.blank? == false 0.blank? == false 

.blank? también evalúa verdadero en cadenas que no están vacías pero que solo contienen espacios en blanco:

 " ".blank? == true " ".empty? == false 

Rails también proporciona .present? , que devuelve la negación de .blank? .

Array gotcha: blank? devolverá false incluso si todos los elementos de una matriz están en blanco. Para determinar el vacío en este caso, ¿usar all? con blank? , por ejemplo:

 [ nil, '' ].blank? == false [ nil, '' ].all? &:blank? == true 

Hice esta tabla útil con todos los casos:

enter image description here

blank? present? son provistos por Rails.

Solo extiende la mesa de Julian:

enter image description here

Ref: vacío? En blanco? Nil? 傻傻 分不清楚

!obj.blank? == obj.present? rápido !obj.blank? == obj.present? !obj.blank? == obj.present?

Puede ser práctico / más fácil para los ojos en algunas expresiones

Una diferencia es esa .nil? y .empty? son métodos que son provistos por el lenguaje de progtwigción Ruby, mientras que .blank? es algo agregado por el framework de desarrollo web Rails.

Un caso especial es cuando intentamos evaluar si un valor booleano es nulo:

 false.present? == false false.blank? == true false.nil? == false 

En este caso, la recomendación sería usar .nil?

enter image description here

  • Todo lo que es nil? está en blank?
  • ¿Todo lo que está empty? está en blank?
  • Nada que esté empty? es nil?
  • Nada que sea nil? esta empty?

tl; dr: ¿solo usar blank? y present? a menos que desee distinguir entre "" y " "

Solo una pequeña nota sobre el any? recomendación: tiene razón en que, en general, es equivalente a !empty? . Sin embargo, any? devolverá true a una cadena de solo espacio en blanco (ala " " ).

Y, por supuesto, vea el comentario anterior de 1.9, también.

No te olvides de any? que generalmente está !empty? . En Rails, normalmente verifico la presencia de algo al final de un enunciado con if something o a unless something luego use en blank? donde sea necesario, ya que parece funcionar en todas partes.

nil? es un método estándar de Ruby que se puede invocar en todos los objetos y devuelve true si el objeto es nil :

 b = nil b.nil? # => true 

empty? es un método Ruby estándar que se puede invocar en algunos objetos como Strings, Arrays y Hashes y devuelve true si estos objetos no contienen ningún elemento:

 a = [] a.empty? # => true b = ["2","4"] b.empty? # => false 

empty? no se puede nil en nil objetos.

blank? es un método de Rails que se puede nil sobre objetos nil así como sobre objetos vacíos.

Todos los demás han explicado bien cuál es la diferencia.

Me gustaría agregar en Ruby On Rails, ¿es mejor usar obj.blank? u obj.present? en lugar de obj.nil? u obj.empty? .

obj.blank? maneja todos los tipos nil , '' , [] , {} , y devuelve true si los valores no están disponibles y devuelve false si los valores están disponibles en cualquier tipo de objeto.

exists? El método se puede usar para verificar si los datos existen en la base de datos o no. Devuelve valores booleanos true o false .

Carriles 4

una alternativa a @ corban-brook’s ‘Array gotcha: blank?’ para verificar si una matriz solo contiene valores vacíos y se puede considerar como en blanco? cierto:

 [ nil, '' ].all? &:blank? == true 

uno también podría hacer:

 [nil, '', "", " ",' '].reject(&:blank?).blank? == true 

nil? se puede usar en cualquier objeto. Determina si el objeto tiene algún valor o no, incluidos los valores ‘en blanco’.

Por ejemplo:

 example = nil example.nil? # true "".nil? # false 

Básicamente nil? solo volverá verdadero si el objeto es de hecho igual a ‘nil’.

empty? solo se llama a los 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 es que no hay elementos en la colección.

Por ejemplo:

 "".empty? # true "hi".empty? # false {}.empty? # true {"" => ""}.empty? # false [].empty? # true [nil].empty? # false nil.empty? # NoMethodError: undefined method `empty?' for nil:NilClass 

¿Aviso que 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 la colección esté vacía.

blank? es básicamente una combinación de nil? y empty? Es útil para verificar objetos que supone que son colecciones, pero también podría ser nulo.