overview - Uma explicação concisa de nil v. Empty v. Blank em Ruby on Rails




ruby on rails rubygems (10)

Eu me vejo repetidamente procurando uma definição clara das diferenças de nil? em blank? e empty? em Ruby on Rails. Aqui está o mais próximo que eu vim:

  • blank? objetos são falsos, vazios ou uma cadeia de espaço em branco. Por exemplo, "" , " " , nil , [] e {} estão em branco.

  • nil? objetos são instâncias de NilClass.

  • empty? os objetos são específicos da classe e a definição varia de classe para classe. Uma string está vazia se não tiver caracteres, e uma matriz estará vazia se não contiver itens.

Há algo faltando ou uma comparação mais estreita que possa ser feita?



Apenas uma pequena nota sobre o any? recomendação: Ele está certo de que geralmente é equivalente a !empty? . No entanto, any? retornará true para uma string de apenas whitespace (ala " " ).

E, claro, veja o 1.9 acima também.


Eu fiz essa tabela útil com todos os casos:

blank? present? são fornecidos pelo Rails.


Não se esqueça de any? que geralmente é !empty? . No Rails eu geralmente verifico a presença de algo no final de uma declaração com if something ou a unless something seguida, use em blank? onde necessário, uma vez que parece funcionar em todos os lugares.


Todo mundo já explicou bem qual é a diferença.

Eu gostaria de adicionar no Ruby On Rails, é melhor usar o obj.blank? ou obj.present? em vez de obj.nil? ou obj.empty? .

obj.blank? processa todos os tipos nil , '' , [] , {} e retorna true se os valores não estiverem disponíveis e retorna false se os valores estiverem disponíveis em qualquer tipo de objeto.


Um caso especial é quando tentamos avaliar se um valor booleano é nulo:

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

Nesse caso, a recomendação seria usar .nil?


  • Tudo o que é nil? está em blank?
  • Tudo que está empty? está em blank?
  • Nada que está empty? é nil?
  • Nada que é nil? está empty?

tl; dr - só usa em blank? e present? a menos que você queira distinguir entre "" e " "


.nil? pode ser usado em qualquer objeto e é verdadeiro se o objeto for nulo.

.empty? pode ser usado em strings, arrays e hashes e retorna true se:

  • Comprimento da corda == 0
  • Comprimento da matriz == 0
  • Comprimento de hash == 0

Correndo. .empty? em algo que é nil lançará um NoMethodError .

Isso é onde .blank? vem dentro É implementado pelo Rails e irá operar em qualquer objeto, assim como funciona como .empty? em seqüências de caracteres, matrizes e hashes.

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

.blank? também avalia true em cadeias que não são vazias, mas contêm apenas espaços em branco:

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

Rails também fornece .present? , que retorna a negação do .blank? .

Array pegadinha: em blank? retornará false mesmo que todos os elementos de uma matriz estejam em branco. Para determinar o vazio neste caso, use all? com blank? , por exemplo:

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

nil? é um método Ruby padrão que pode ser chamado em todos os objetos e retorna true se o objeto for nil :

b = nil
b.nil? # => true

empty? é um método Ruby padrão que pode ser chamado em alguns objetos como Strings, Arrays e Hashes e retorna true se esses objetos não contiverem nenhum elemento:

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty? não pode ser chamado em objetos nil .

blank? é um método Rails que pode ser chamado em objetos nil , assim como em objetos vazios.


nil? pode ser usado em qualquer objeto. Determina se o objeto tem algum valor ou não, incluindo valores 'em branco'.

Por exemplo:

example = nil
example.nil?  # true

"".nil?  # false

Basicamente nil? só retornará true se o objeto for de fato igual a 'nil'.

empty? só é chamado em objetos que são considerados uma coleção. Isso inclui coisas como strings (uma coleção de caracteres), hashes (uma coleção de pares de chave / valor) e arrays (uma coleção de objetos arbitrários). empty? retorna true, não há itens na coleção.

Por exemplo:

"".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? não pode ser chamado em objetos nulos, pois objetos nulos não são uma coleção e irão gerar uma exceção.

Observe também que, mesmo que os itens em uma coleção estejam em branco, isso não significa que uma coleção está vazia.

blank? é basicamente uma combinação de nil? e empty? É útil para verificar objetos que você supõe serem coleções, mas também pode ser nulo.





ruby