Uma explicação concisa de nulo v. vazio v. em branco em Ruby on Rails

Eu me encontro repetidamente procurando por uma definição clara das diferenças de nil?, blank?, e empty? em Ruby on Rails. Aqui's o I's mais próximo de mim:

  • Os objectos são falsos, vazios ou uma cadeia de caracteres em branco. Por exemplo, "", " ", nil, [], e {} estão em branco.

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

*empty? objetos são específicos de classe, e a definição varia de classe para classe. Uma string é vazia se não tiver caracteres, e um array é vazio se não contiver itens.

Falta alguma coisa, ou pode ser feita uma comparação mais apertada?

Solução

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

.vazio? pode ser utilizado em cordas, arrays e hashes e retorna verdadeiro se:

  • Comprimento da corda == 0
  • Comprimento do feixe == 0
  • Comprimento do chichi == 0

Executando .empty? em algo que é nulo vai jogar um NoMethodError.

É aí que entra o "em branco". Ele é implementado pelo Rails e irá operar em qualquer objeto, bem como trabalhar como .empty? em strings, arrays e hashes.

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

.em branco? também avalia verdadeiro em cordas que não são vazias, mas contêm apenas espaço em branco:

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

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

Array gotcha: blank? retornará false mesmo que todos os elementos de um array estejam em branco. Para determinar a falta de clareza neste caso, utilize all? com blank?, por exemplo:

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

Uma diferença é que .nil? e .empty? são métodos que são fornecidos pela linguagem de programação Ruby, enquanto .blank? é algo adicionado pelo framework de desenvolvimento web Rails.

Comentários (0)

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

Comentários (2)