É ruim verificar se uma matriz não está vazia usando o any?
método?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
Ou é melhor usar unless a.empty?
?
any?
não é o mesmo que not empty?
em alguns casos.
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
A partir da documentação:
Se o bloco não for fornecido, Ruby adiciona um bloco implícito de {| obj | obj} (qualquer um? retornará true se pelo menos um dos membros da coleção não for falso ou nulo).
empty?
?present?
.#present?
é apenas para Rails. Em puro Ruby você teráNoMethodError: undefined method 'present?' for Array
.require 'activesupport'
.A diferença entre uma matriz que avalia seus valores para
true
ou se está vazia.O método
empty?
vem da classe Arrayhttp://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
É usado para verificar se a matriz contém algo ou não. Isso inclui coisas que avaliam
false
, comonil
efalse
.O método
any?
vem do módulo Enumerable.http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
É usado para avaliar se "qualquer" valor na matriz é avaliado
true
. Métodos semelhantes a este sãonone?
,all?
eone?
, onde tudo apenas verificar para ver quantas vezes verdadeira poderia ser avaliada. que não tem nada a ver com a contagem de valores encontrados em uma matriz.caso 1
caso 2
caso 3
fonte
O prefixo da instrução com um ponto de exclamação permitirá que você saiba se a matriz não está vazia. Então, no seu caso -
fonte
Evite
any?
para matrizes grandes.any?
éO(n)
empty?
éO(1)
any?
não verifica o comprimento, mas verifica na verdade toda a matriz em busca de elementos verdadeiros.empty?
por outro lado, verifica apenas o comprimento da matriz.A diferença é relevante se você tiver matrizes "esparsas" que começam com muitos
nil
valores, como, por exemplo, uma matriz que acabou de ser criada.fonte
nil
valores, com matrizes "normais"any?
sem retorno de bloco no primeiro elemento, portanto a complexidade ainda é O (1) como oempty?
métodoVou sugerir o uso
unless
eblank
para verificar se está vazio ou não.Exemplo:
Isso saberá 'a' vazio ou não. Se 'a' estiver em branco, o código abaixo não será executado.
fonte
#blank?
faz parte do Rails. Se eles já estão usando o Rails,#present?
é a negação de#blank?
qualquer maneira.Eu não acho que é ruim de usar
any?
. Eu uso isto muito. É claro e conciso.No entanto, se você está preocupado com todos os
nil
valores que estão jogando fora, está realmente perguntando se a matriz possuisize > 0
. Nesse caso, essa extensão simples (NÃO otimizada, no estilo de macaco) o aproximaria.Isso é bastante descritivo, perguntando logicamente "esse objeto tem um tamanho?". E é conciso e não requer o ActiveSupport. E é fácil de construir.
Alguns extras a serem considerados:
present?
do ActiveSupport.String
, que ignore o espaço em branco (comopresent?
faz).length?
paraString
ou outros tipos em que possa ser mais descritivo.Integer
e outrosNumeric
tipos, para que um zero lógico retornefalse
.fonte