Encontro-me várias vezes à procura de uma definição clara das diferenças nil?
, blank?
e, empty?
em Ruby on Rails. Aqui está o mais perto que eu cheguei:
blank?
objetos são falsos, vazios ou uma sequência de espaços em branco. Por exemplo,""
," "
,nil
,[]
, e{}
estão em branco.nil?
objetos são instâncias do NilClass.empty?
os objetos são específicos da classe e a definição varia de classe para classe. Uma cadeia está vazia se não tiver caracteres e uma matriz está vazia se não contiver itens.
Falta alguma coisa ou pode ser feita uma comparação mais rigorosa?
ruby-on-rails
ruby
Arrel
fonte
fonte
present?
. Isso ocorre porqueblank?
retorna verdadeiro para uma matriz vazia.:nil?
é definido em::Kernel
e substituído em::NilClass
, enquanto:empty?
é implementado separadamente em muitas classes (nativamente em::String
,::Array
,::Hash
, e não de forma nativa em outras classes como::Set
de stdlib e::ActiveRecord::Relation
de trilhos). Portanto,:nil?
está disponível em todas as subclasses::Object
e também em todas as classes que incluem::Kernel
por si só, onde:empty?
devem ser implementadas ou incluídas especificamente em suas classes.nil
conceito, comece aqui .[1] pry(main)> [].blank? => true
Respostas:
.nil?
pode ser usado em qualquer objeto e é verdadeiro se o objeto for nulo..empty?
pode ser usado em strings, matrizes e hashes e retorna true se:Correr
.empty?
em algo que é nulo lançará aNoMethodError
.É aí que
.blank?
entra. É implementado pelo Rails e operará em qualquer objeto, além de funcionar como.empty?
strings, matrizes e hashes..blank?
também avalia true em strings que não estão vazias, mas contêm apenas espaço em branco:O Rails também fornece
.present?
, que retorna a negação de.blank?
.Pegue a matriz:
blank?
retornaráfalse
mesmo se todos os elementos de uma matriz estiverem em branco. Para determinar o vazio neste caso, useall?
comblank?
, por exemplo:fonte
false.blank? == true
presence
!Eu fiz esta tabela útil com todos os casos:
blank?
,present?
são fornecidos pelo Rails.fonte
any?
se alguma vez atualizar a tabela.blank?
epresent?
não são " somente Rails ", eles são incluídos automaticamente pelo Rails, mas podem ser facilmente incluídos no código não-Rails usando as extensões principais do ActiveSupport. Veja stackoverflow.com/questions/4238867/…Apenas estenda a tabela de Julian:
Ref: vazio? Em branco? Nulo? 傻傻 分不清楚
fonte
Enumerable#any?
é baunilha Ruby, ele não deve ser listado em "trilhos apenas".zero?
e.nonzero?
Dica rápida:
!obj.blank? == obj.present?
Pode ser útil / mais fácil para os olhos em algumas expressões
fonte
present?
é parte de active_support, confira aqui sobre o que incluir para obtê-lo: stackoverflow.com/a/4648704/1569!!false
Uma diferença é que
.nil?
e.empty?
são os métodos fornecidos pela linguagem de programação Ruby, ao passo que.blank?
é algo adicionado pelo framework de desenvolvimento web Rails.fonte
nil?
éblank?
empty?
éblank?
empty?
énil?
nil?
éempty?
tl; dr - use somente
blank?
& apresent?
menos que você queira distinguir entre""
e" "
fonte
Um caso especial é ao tentar avaliar se um valor booleano é nulo:
Nesse caso, a recomendação seria usar
.nil?
fonte
Apenas uma pequena nota sobre a
any?
recomendação: ele está certo de que geralmente é equivalente!empty?
. No entanto,any?
retornarátrue
a uma sequência de apenas espaço em branco (ala" "
).E, claro, veja também o comentário 1.9 acima.
fonte
Não esqueça o
any?
que é geralmente!empty?
. No Rails, normalmente verifico a presença de algo no final de uma declaração comif something
ouunless something
então usoblank?
quando necessário, pois parece funcionar em qualquer lugar.fonte
any?
para verificar o não vazio. Retorna false se você tiver uma matriz de valores falsos. Uma maneira de contornar isso é passar um bloco sempre verdadeiro:,[nil, false].any?{ true }
mas!empty?
é mais curto e você não se lembra do comportamento estranho.nil?
é um método Ruby padrão que pode ser chamado em todos os objetos e retornatrue
se o objeto fornil
:empty?
é um método Ruby padrão que pode ser chamado em alguns objetos, como Strings, Arrays e Hashes, e retornatrue
se esses objetos não contiverem elemento:empty?
não pode ser chamado emnil
objetos.blank?
é um método Rails que pode ser chamado emnil
objetos e em objetos vazios.fonte
Todo mundo já explicou bem qual é a diferença.
Eu gostaria de adicionar no Ruby On Rails, é melhor usar
obj.blank?
ou emobj.present?
vez deobj.nil?
ouobj.empty?
.obj.blank?
controla todos os tiposnil
,''
,[]
,{}
, e retornostrue
se os valores não estão disponíveis e retornosfalse
se os valores estão disponíveis em qualquer tipo de objeto.fonte
exists?
O método pode ser usado para verificar se os dados existem no banco de dados ou não. Retorna valores booleanostrue
oufalse
.fonte
Trilhos 4
uma alternativa para @ corban-brook 's Array gotcha: blank? para verificar se uma matriz contém apenas valores vazios e pode ser considerada em branco? verdade:
também se poderia fazer:
fonte
nil?
pode ser usado em qualquer objeto. Determina se o objeto tem algum valor ou não, incluindo valores 'em branco'.Por exemplo:
Basicamente
nil?
, somente retornará true se o objeto for de fato igual a 'nil'.empty?
é chamado apenas 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 matrizes (uma coleção de objetos arbitrários).empty?
retorna true é que não há itens na coleção.Por exemplo:
Observe que
empty?
não é possível chamar objetos nulos, pois objetos nulos não são uma coleção e isso gera uma exceção.Observe também que, mesmo que os itens de uma coleção estejam em branco, isso não significa que uma coleção esteja vazia.
blank?
é basicamente uma combinação denil?
eempty?
É útil para verificar objetos que você supõe serem coleções, mas também pode ser nulo.fonte