tutorial rails que ejemplos curso caracteristicas ruby-on-rails ruby

ruby-on-rails - que - ruby on rails tutorial



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

¿Me encuentro repetidamente buscando una definición clara de las diferencias de nil? en blank? y empty? en Ruby sobre rieles. Aquí está lo más cerca que he venido:

  • blank? los objetos son falsos, 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 cada clase, y la 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.

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


Hice esta tabla útil con todos los casos:

blank? , present? son proporcionados por Rails.


No te olvides de any? ¿cuál es generalmente !empty? . En Rails, por lo general, verifico la presencia de algo al final de una declaración con if something o, a unless something luego use en blank? Donde sea necesario ya que parece funcionar en todas partes.


Rieles 4

una alternativa a ''Array gotcha: blank?'' de @ corban-brook '' para comprobar si una matriz solo contiene valores vacíos y se puede considerar en blanco? cierto:

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

También se podría hacer:

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


Sólo una pequeña nota sobre el any? recomendación: tiene razón en que generalmente es 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.



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


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

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

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


Una diferencia es que .nil? y .empty? ¿Son los métodos proporcionados por el lenguaje de programación Ruby, mientras que .blank? Es algo que added el framework de desarrollo web Rails.


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

tl; dr - usar solo en blank? y present? a menos que quieras distinguir entre "" y " "


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

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


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

.empty? se puede utilizar en cadenas, matrices y hashes y devuelve true si:

  • Longitud de la cuerda == 0
  • Longitud de la matriz == 0
  • Longitud de hash == 0

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

Ahí es donde .blank? entra. Es implementado por Rails y operará en cualquier objeto, así como en trabajos como .empty? Sobre cuerdas, matrices y hashes.

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: en blank? devolverá false incluso si todos los 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


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


nil? Puede ser utilizado 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 devolverá verdadero si el objeto es de hecho igual a ''nil''.

empty? Sólo se invoca en 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 true si 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

Tenga en cuenta que empty? no se puede llamar 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 una colección esté vacía.

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


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

b = nil b.nil? # => true

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

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