web-dev-qa-db-fra.com

Existe-t-il une meilleure façon de vérifier la valeur Nil ou la longueur == d’une chaîne en Ruby?

Existe-t-il un meilleur moyen que le suivant pour vérifier si une chaîne est nil OR a une longueur de 0 en Ruby?

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

En C #, c'est pratique

string.IsNullOrEmpty(myString)

Quelque chose de semblable à celui de Ruby?

161
Jim Fiorato

Quand je ne m'inquiète pas de la performance, j'utilise souvent ceci:

if my_string.to_s.empty?
  # It's nil or empty
end
214
Ezran

Si vous souhaitez exiger ActiveSupport, vous pouvez simplement utiliser la méthode #blank?, qui est définie pour NilClass et String.

67
Avdi

J'aime procéder comme suit (dans un environnement autre que Rails/ActiveSupport):

variable.to_s.empty?

cela fonctionne parce que:

nil.to_s == ""
"".to_s == ""
61
Vinay Sahni

Une alternative à la proposition de JCY serait:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
31
Rômulo Ceccon

Comme il a été dit ici avant que Rails (ActiveSupport) ait un utilitaire blank? La méthode et elle est implémentée comme ceci:

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

Assez facile à ajouter à tout projet basé sur Ruby.

La beauté de cette solution est qu’elle fonctionne automatiquement, non seulement pour les chaînes, mais également pour les tableaux et d’autres types.

28
Honza

variable.blank? va le faire . Il renvoie true si la chaîne est vide ou si la chaîne est nil.

15
Satya Kalluri

nil? peut être omis dans des contextes booléens. Généralement, vous pouvez utiliser ceci pour répliquer le code C #:

return my_string.nil? || my_string.empty?
12
Konrad Rudolph

Tout d’abord, méfiez-vous de cette méthode:

Comme Jesse Ezel dit:

Brad Abrams

"La méthode peut sembler pratique, mais la plupart du temps, j’ai trouvé que cette situation résultait de la tentative de dissimuler des bogues plus profonds.

Votre code doit être conforme à un protocole particulier sur l'utilisation de chaînes et vous devez comprendre son utilisation dans le code de la bibliothèque et dans le code avec lequel vous travaillez.

Le protocole NullOrEmpty est généralement une solution miracle (le vrai problème réside donc toujours ailleurs, et vous avez deux protocoles utilisés) ou un manque d'expertise dans un protocole particulier lors de l'implémentation d'un nouveau code (et encore, vous devriez vraiment savoir quoi). vos valeurs de retour sont). "

Et si vous corrigez la classe String ... assurez-vous que NilClass n'a pas été corrigé non plus !

class NilClass
    def empty?; true; end
end
7
VonC

Chaque classe a une méthode nil?:

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

Et les chaînes ont la méthode empty?:

if a_string.empty?
    # the string is empty
}

Rappelez-vous qu'une chaîne ne pas est égale à nil lorsqu'elle est vide, utilisez donc la méthode empty? pour vérifier si une chaîne est vide.

5
Jeremy Ruten

Une autre option consiste à convertir nil en un résultat vide à la volée:

(my_string||'').empty?

4
mahemoff

Konrad Rudolph a la bonne réponse.

Si cela vous gêne vraiment, monkey corrige la classe String ou l'ajoute à une classe/module de votre choix. Ce n'est vraiment pas une bonne pratique de corriger les objets de base du singe, sauf si vous avez une raison vraiment convaincante.

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

Ensuite, vous pouvez faire String.nilorempty? mystring

2
jcoby

Recherchez les chaînes vides dans Ruby Plain tout en évitant les exceptions NameError

Il y a quelques bonnes réponses ici, mais vous n'avez pas besoin d'ActiveSupport ou du patch-singe pour traiter le cas d'utilisation courant ici. Par exemple:

my_string.to_s.empty? if defined? my_string

Ceci "fera le bon choix" si my_string est nul ou une chaîne vide, mais ne générera pas d'exception NameError si my_string n'est pas défini. Ceci est généralement préférable aux plus artificiels:

my_string.to_s.empty? rescue NameError

ou sa plus bavarde, parce que les exceptions doivent vraiment être sauvegardées pour des choses que vous attendez {pas _. Dans ce cas, bien que cela puisse être une erreur courante, une variable non définie n'est pas vraiment une circonstance exceptionnelle, elle doit donc être traitée en conséquence.

Votre kilométrage peut varier.

2
Todd A. Jacobs

Avez-vous essayé les raffinements?

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?
1
RichOrElse

Pour les golfeurs de code (nécessite Ruby 2.3 ou version ultérieure):

if my_string&.> ""
  p 'non-empty string'
else
  p 'nil or empty string'
end
0
snipsnipsnip

Dans Rails, vous pouvez essayer #blank?.

Attention: cela vous donnera des résultats positifs lorsque la chaîne est composée d'espaces:

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

Je voulais juste le signaler. Peut-être que cela répond à vos besoins

UPD. pourquoi ai-je de vieilles questions dans mon fil? ?__. Désolé pour le nécropostage.

0
Nondv