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?
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
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:
blank?
, present?
son proporcionados por los Carriles.
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
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
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.
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
- Todo lo que es
nil?
esblank?
- Todo lo que es
empty?
esblank?
- Nada de lo que es
empty?
esnil?
- Nada de lo que es
nil?
esempty?
Tl; dr use solo use blank?
& present?
a menos que quiera distinguir entre ""
y " "
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?
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.
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.
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.
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.
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
.
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
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.
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