Una explicación concisa de nil v. empty v. blank en Ruby on Rails


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

  • blank? los objetos son false, vacíos o una cadena de espacios en blanco. Por ejemplo, "", " ", nil, [], y {} están en blanco.

  • nil? los objetos son instancias de NilClass.

  • empty? los objetos son específicos de clase, y la definición varía de clase a clase. 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?

Author: Jonathan Leffler, 2009-05-20

14 answers

.nil? se puede usar en cualquier objeto y es true si el objeto es nil.

.empty? se puede usar en cadenas, arrays y hashes y devuelve true si:

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

Corriendo .empty? en algo que es nil lanzará un NoMethodError.

Ahí es donde entra .blank?. Es implementado por Rails y funcionará en cualquier objeto, así como funciona como .empty? en cadenas, arrays 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 true 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 un array están en blanco. Para determinar el vacío en este caso, use all? con blank?, por ejemplo:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
 1300
Author: Corban Brook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 11:39:24

Hice esta tabla útil con todos los casos:

introduzca la descripción de la imagen aquí

blank?, present? son proporcionados por los Carriles.

 596
Author: Julian Popov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-12 16:19:17

Simplemente extienda la tabla de Julian:

introduzca la descripción de la imagen aquí

Ref: vacío?en blanco?nil?傻傻分不清楚

 179
Author: Sibevin Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-04 14:09:37

Consejo Rápido: !obj.blank? == obj.present?

Puede ser útil / más fácil para los ojos en algunas expresiones

 56
Author: Alexander Malfait,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 11:33:23

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

 43
Author: Andrew Grimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-14 14:53:41

introduzca la descripción de la imagen aquí

  • Todo lo que es nil? es blank?
  • Todo lo que es empty? es blank?
  • Nada de lo que es empty? es nil?
  • Nada de lo que es nil? es empty?

Tl; dr use solo use blank? & present? a menos que quiera distinguir entre "" y " "

 11
Author: steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 18:17:51

Un caso especial es cuando se trata de evaluar si un valor booleano es nil:

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

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

 10
Author: Alan H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-14 13:56:02

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

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

 8
Author: davemyron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-13 19:25:16

No olvides any? que generalmente es !empty?. En Rails normalmente compruebo la presencia de algo al final de una instrucción con if something o unless something y luego uso blank? donde sea necesario, ya que parece funcionar en todas partes.

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-19 23:51:50

nil? es un método Ruby estándar 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 Cadenas, 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 invocar en objetos nil.

blank? es un método Rails que se puede invocar tanto en objetos nil como en objetos vacíos.

 6
Author: neha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 18:27:21

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

Me gustaría añadir en Ruby On Rails, es mejor usar obj.blank? o obj.present? en lugar de obj.nil? o 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.

 2
Author: Manish Shrivastava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 18:25:33

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

 2
Author: kelvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 19:05:37

Carriles 4

Una alternativa al Array de @corban-brook gotcha: blank?' para comprobar si una matriz solo contiene valores vacíos y puede considerarse en blanco? verdadero:

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

Uno también podría hacer:

[nil, '', "", " ",'  '].reject(&:blank?).blank? == true
 1
Author: mahatmanich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-19 13:52:27

nil? se puede utilizar en cualquier objeto. Determina si el objeto tiene algún valor o no, incluyendo valores 'en blanco'.

Por ejemplo:

example = nil
example.nil?  # true

"".nil?  # false

Básicamente nil? solo devolverá true si el objeto es de hecho igual a 'nil'.

empty? solo se llama a 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 arrays (una colección de objetos arbitrarios). empty? devuelve true es que no hay artículos 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

Observe que empty? no se puede llamar en objetos nil ya que los objetos nil 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 de nil? y empty? Es útil para comprobar objetos que se supone que son colecciones, pero también podría ser nil.

 0
Author: Chitra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 18:23:46