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

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

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


953
2018-05-19 22:51


origen


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:

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

Corriendo .empty? en algo que es nulo arrojará un NoMethodError.

Eso es donde .blank? entra. Es implementado por Rails y operará en cualquier objeto y 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? regresará false incluso si todo elementos de una matriz 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 

1276
2018-05-20 16:14



Hice esta tabla útil con todos los casos:

enter image description here


581
2017-12-18 16:29



Solo extiende la mesa de Julian:

enter image description here

Árbitro: ¿vacío? ¿en blanco? nil? 傻傻 分不清楚


173
2017-11-12 00:20



Consejo rapido: !obj.blank? == obj.present?

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


56
2017-07-13 11:33



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


43
2018-05-19 23:42



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?


9
2017-11-14 13:56



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

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


8
2017-07-13 19:25



enter image description here

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

tl; dr - solo uso blank? & present? a menos que desee distinguir entre "" y " "


8
2018-01-15 18:17



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


7
2018-05-19 23:51



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

b = nil
b.nil? # => true

empty? es un método estándar de Ruby que se puede invocar en algunos objetos como cadenas, matrices 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 puede ser llamado nil objetos.

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


6
2017-12-22 05:41



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? 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 regresa false si los valores están disponibles en cualquier tipo de objeto.


2
2018-05-20 07:55