2015-12-03 2 views
17

Je veux dire qu'une chaîne est vide si elle est vide ou ne contient que des espaces. Par exemple, "", " " et "\n" sont tous vides.Comment vérifier si une chaîne est vide dans Elixir

Dans Rails, nous avons la méthode .blank?.

Y a-t-il quelque chose de similaire dans Elixir (ou dans le Framework Phoenix)?

Répondre

12

Il y a String.strip/1 qui convertira vos 3 exemples en "" que vous pouvez comparer.

iex(4)> String.strip("\n") == "" 
true 
iex(5)> String.strip("") == "" 
true 
iex(6)> String.strip(" ") == "" 
true 

Il y avait un problème à ce sujet https://github.com/elixir-lang/elixir/pull/2707

+1

Et si je veux faire ça à l'intérieur d'un garde? La bande – nicooga

+0

a été dépréciée en douceur dans Elixir> 1.3.0. https://github.com/elixir-lang/elixir/releases/tag/v1.3.0 – stevendaniels

+3

@nicooga Si vous voulez juste vérifier les chaînes vides à l'intérieur de la garde, essayez: 'quand binary_part (chaîne, 1, - 1) ' –

3

J'ai publié une bibliothèque minuscule pour le faire correctement pour n'importe quel type de données. Il implémente un comportement identique à la méthode blank? de Rails dans Elixir dans la mesure du possible.

Library est ici: https://github.com/samphilipd/blankable

Pour installer, ajouter blankable à votre liste de dépendances dans mix.exs:

def deps do 
    [{:blankable, "~> 0.0.1"}] 
end 
1

pourquoi ne pas simplement utiliser modèle correspondant

iex> a = "" 
"" 
iex> b = "b" 
"b" 
iex> ^b = "b" 
"b" 
iex> ^a = "your String" 
** (MatchError) no match of right hand side value: "" 
iex> ^a = "" 
"" 

ou mieux encore vérifier sa taille d'octet

iex> if byte_size("") == 0 do true else false end 
true 
iex> if byte_size("a") == 0 do true else false end 
false 
+0

Je viens juste de commencer à apprendre Elixir, mais même en tant que débutant, je trouve que l'appariement des formes est idiomatique. –