2 votes

La variable Elixir n'est pas sûre car elle a été définie à l'intérieur d'un cas/cond/réception.

J'ai cette regex qui est censée extraire des captures nommées d'une ligne de journal. Si la première regex échoue, elle est censée passer à une deuxième regex et l'essayer à la place. Voici donc mon code actuel :

captures = Regex.named_captures(first_regex, log)
if captures == nil do
    captures = Regex.named_captures(backup_regex, log)
end

J'utilise cette méthode pour éviter d'exécuter deux regex si la première est une correspondance (suffisant dans mon scénario). Cette méthode génère un avertissement indiquant que the variable "captures" is unsafe as it has been set inside a case/cond/receive/if/&&/||. Please explicitly return the variable value instead.

Je pourrais le réécrire de cette façon pour qu'il cesse de lancer cet avertissement :

captures = 
    case Regex.named_captures(squid_re, log) do
        nil -> Regex.named_captures(dante_re, log)
        {:username} -> # How do I return with username?
    end

mais, comme c'est mon premier jour avec elixir, je ne sais pas comment assigner ce nom d'utilisateur à l'adresse captures variable. Vous avez des idées ?

3voto

Dogbert Points 44003

Pour ce cas particulier, vous pouvez simplement utiliser || car pour nil (y false ), || retournera la valeur de la RHS, sinon la LHS :

captures = Regex.named_captures(first_regex, log) || Regex.named_captures(backup_regex, log)

Si vous voulez vraiment utiliser case c'est comme ça qu'il faut faire :

captures = case Regex.named_captures(first_regex, log) do
  nil -> Regex.named_captures(backup_regex, log)
  captures -> captures
end

Le deuxième motif correspondra à n'importe quelle valeur et assignera sa valeur à captures et vous pouvez simplement renvoyer la même valeur. Je suggère d'utiliser || si le code est très similaire à celui que vous avez posté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X