Existe uma maneira melhor de verificar zero ou comprimento == 0 de uma seqüência de caracteres em Ruby?

169

Existe uma maneira melhor do que a seguinte para verificar se uma string é nula OU tem um comprimento de 0 em Ruby?

if !my_string || my_string.length == 0
  return true
else
  return false
end

Em C # há a mão

string.IsNullOrEmpty(myString)

Algo semelhante ao de Ruby?

Jim Fiorato
fonte
16
É redundante ter uma declaração if como esta: "if (condition) then true else false". A condição em si tem a mesma veracidade que a declaração if.
precisa saber é o seguinte
my_string || my_string.length == 0aumentará um NoMethodErrorse my_stringfor nulo. Eu acho que você quis dizer:my_string.nil? || my_string.length == 0
Naveed
1
Deveria ser!my_string || my_string.length == 0
levsa 28/09

Respostas:

224

Quando não estou preocupado com o desempenho, usarei frequentemente isso:

if my_string.to_s == ''
  # It's nil or empty
end

Existem várias variações, é claro ...

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end
Ezran
fonte
2
A variação usando strippode ser bastante ineficiente.
Marc-André Lafortune
10
Outra maneira interessante é my_string.to_s.empty?
Ricardo Pessoa
Para a maioria das pessoas, a primeira opção será completamente aceitável e terá boa leitura.
amrcus
68

Se você deseja solicitar o ActiveSupport, basta usar o #blank?método definido para NilClass e String.

Avdi
fonte
15
Observe que uma String contendo apenas espaço em branco ainda é considerada em branco. Então "" .blank? é verdade.
Grant Hutchins
2
Além disso, boolean false, {} e [] são considerados em branco. Ou seja, {} .blank ?, [] .blank ?, false.blank? todos são avaliados como verdadeiros.
ShaharZ
64

Eu gosto de fazer o seguinte (em um ambiente que não seja Rails / ActiveSupport):

variable.to_s.empty?

isso funciona porque:

nil.to_s == ""
"".to_s == ""
Vinay Sahni
fonte
3
Uma boa explicação por que string.to_s.empty?funciona para ambos nile "".
Georger
31

Uma alternativa à proposta do jcoby seria:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
Rômulo Ceccon
fonte
10
Mas .. mas .. A biblioteca principal do ruby ​​já implementa isso. nil.to_s => "", para que você possa dizer o que é coisa.to_s == ""
DigitalRoss
1
@DigitalRoss Isso evita a conversão de string, que pode ou não ser um pequeno problema de desempenho.
Vortico
30

Como foi dito aqui antes do Rails (ActiveSupport) ter um espaço em branco útil ? método e é implementado assim:

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

Muito fácil de adicionar a qualquer projeto baseado em rubi.

A vantagem dessa solução é que ela funciona automaticamente, não apenas para Strings, mas também para matrizes e outros tipos.

Honza
fonte
15

variable.blank? vai fazer isso. Retorna true se a string estiver vazia ou se a string for nula.

Satya Kalluri
fonte
12
Na verdade, essa é apenas uma extensão de trilhos, não um puro rubi. Mas se você estiver usando trilhos, é muito útil!
James P McGrath.
13

nil?pode ser omitido em contextos booleanos. Geralmente, você pode usar isso para replicar o código C #:

return my_string.nil? || my_string.empty?
Konrad Rudolph
fonte
7

Primeiro de tudo, cuidado com esse método:

Como Jesse Ezel diz:

Brad Abrams

"O método pode parecer conveniente, mas na maioria das vezes eu descobri que essa situação surge da tentativa de encobrir erros mais profundos.

Seu código deve seguir um protocolo específico sobre o uso de strings e você deve entender o uso do protocolo no código da biblioteca e no código com o qual você está trabalhando.

O protocolo NullOrEmpty geralmente é uma solução rápida (portanto, o problema real ainda está em outro lugar, e você tem dois protocolos em uso) ou é uma falta de conhecimento em um protocolo específico ao implementar um novo código (e, novamente, você realmente deve saber o que seus valores de retorno são). "

E se você aplicar patch à classe String ... verifique se o NilClass também não foi corrigido !

class NilClass
    def empty?; true; end
end
VonC
fonte
5

Toda classe tem um nil?método:

if a_variable.nil?
    # the variable has a nil value
end

E as cordas têm o empty?método:

if a_string.empty?
    # the string is empty
}

Lembre-se de que uma string não é igual nilquando está vazia; portanto, use o empty?método para verificar se uma string está vazia.

Jeremy Ruten
fonte
4

Outra opção é converter nada em um resultado vazio em tempo real:

(my_string||'').empty?

mahemoff
fonte
2

Konrad Rudolph tem a resposta certa.

Se isso realmente o incomoda, faça um patch para a classe String ou adicione-a a uma classe / módulo de sua escolha. Realmente não é uma boa prática usar objetos principais do patch, a menos que você tenha uma razão realmente convincente.

class String
  def self.nilorempty?(string)
    string.nil? || string.empty?
  end
end

Então você pode fazer String.nilorempty? mystring

jcoby
fonte
2

Verifique se há cadeias vazias no Ruby comum, evitando exceções de NameError

Há algumas boas respostas aqui, mas você não precisa do ActiveSupport ou do patch de macacos para resolver o caso de uso comum aqui. Por exemplo:

my_string.to_s.empty? if defined? my_string

Isso "fará a coisa certa" se my_string for nulo ou uma string vazia, mas não gerará uma exceção NameError se my_string não estiver definido. Isso geralmente é preferível ao mais artificial:

my_string.to_s.empty? rescue NameError

ou é mais detalhado, porque as exceções devem ser realmente salvas para coisas que você não espera que aconteçam. Nesse caso, embora possa ser um erro comum, uma variável indefinida não é realmente uma circunstância excepcional, portanto deve ser tratada de acordo.

Sua milhagem pode variar.

Todd A. Jacobs
fonte
1

Você já experimentou refinamentos?

module Nothingness
  refine String do
    alias_method :nothing?, :empty?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

return my_string.nothing?
RichOrElse
fonte
1

Se você estiver usando trilhos, você pode usar #present?

require 'rails'

nil.present?  # ==> false (Works on nil)
''.present?    # ==> false (Works on strings)
'  '.present?  # ==> false (Works on blank strings)
[].present?    # ==> false(Works on arrays)
false.present? # ==> false (Works on boolean)

Por isso, verifique inversamente o uso de comprimento nulo ou zero !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true
Dhivya Dandapani
fonte
0

Nos trilhos você pode tentar #blank?.

Atenção: ele fornecerá pontos positivos quando a string for composta por espaços:

nil.blank? # ==> true
''.blank? # ==> true
'  '.blank? # ==> true
'false'.blank? # ==> false

Só queria salientar. Talvez atenda às suas necessidades

UPD. por que estou recebendo perguntas antigas no meu feed? Desculpe pelo necroposting.

Nondv
fonte
0

Para jogadores de código:

if my_string=~/./
  p 'non-empty string'
else
  p 'nil or empty string'
end

Ou se você não é um jogador de golfe (requer ruby ​​2.3 ou posterior):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
snipsnipsnip
fonte