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

Me encuentro buscando repetidamente una definición clara de las diferencias entre "cero", "blanco" y "vacío" en Ruby on Rails. Esto es lo más cerca que he llegado:

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

  • Los objetos nil son instancias de NilClass.

  • Los objetos "vacíos" son específicos de cada clase, y su 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 ajustada?

Solución

El valor de .nil se puede utilizar en cualquier objeto y es verdadero si el objeto es nulo.

El parámetro .empty? se puede utilizar en cadenas, arrays y hashes y devuelve true si:

  • Longitud de la cadena == 0
  • Longitud de la matriz == 0
  • Longitud de un Hash == 0

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

Aquí es donde entra en juego .blank?. Está implementado por Rails y funciona con cualquier objeto, así como con cadenas, arrays y hashes.

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

El parámetro .blank? también se evalúa como verdadero en cadenas que no están vacías pero que sólo contienen espacios en blanco:

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

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

Problema con los arrays: blank? devuelve false incluso si todos los elementos de un array están vacíos. Para determinar el espacio en blanco en este caso, utilice "todos" con "en blanco", por ejemplo:

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 
Comentarios (12)

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

Comentarios (0)

No te olvides de "cualquier", que generalmente es "vacío". En Rails suelo comprobar la presencia de algo al final de una sentencia con "si algo" o "a menos que algo" y luego uso "en blanco" cuando es necesario, ya que parece funcionar en todas partes.

Comentarios (2)