web-dev-qa-db-fra.com

Puis-je concaténer des chaînes dans Elixir et utiliser l'opérateur de tuyau?

Dans Elixir, vous pouvez concaténer des chaînes avec l'opérateur <>, Comme dans "Hello" <> " " <> "World".

Vous pouvez également utiliser l'opérateur de tuyau |> Pour chaîner des fonctions ensemble.

J'essaie d'écrire le code Elixir pour formater la devise d'un jeu en ligne.

def format_price(price) do
  price/10000
  |> Float.round(2)
  |> to_string
  |> <> "g"
end

Ce qui précède entraîne une erreur de syntaxe. Suis-je en train d'oublier une fonction de base qui peut concaténer des chaînes? Je sais que je peux en définir un moi-même, mais cela semble créer un encombrement inutile dans mon code si je peux l'éviter.

Je me rends compte que je peux accomplir la même chose, en enchaînant simplement les méthodes comme to_string(Float.round(price/10000, 2)) <> "g", mais cette syntaxe n'est pas aussi agréable à lire, et il est plus difficile d'étendre la méthode à l'avenir, si Je veux ajouter des étapes entre les deux.

Elixir a-t-il des moyens de concaténer du texte à l'aide de l'opérateur de tuyau, ou n'est-ce pas possible sans définir la méthode vous-même?

27
Kevin

Oui, vous pouvez, en passant le chemin complet de la fonction, qui dans ce cas est Kernel.<>:

iex(1)> "foo" |> Kernel.<>("bar")
"foobar"
38
Dogbert

Mes deux centimes

Je me rends compte que je peux accomplir la même chose, en enchaînant simplement les méthodes comme to_string (Float.round (price/10000, 2)) <> "g", mais cette syntaxe n'est pas aussi agréable à lire, et elle la rend plus difficile d'étendre la méthode à l'avenir, si je veux ajouter des étapes entre les deux.

Vous pouvez utiliser l'interpolation au lieu de la concaténation . Par exemple, vous pouvez le faire comme ceci et c'est toujours correct à lire, et simple, si facile à modifier:

def format_price(price) do
  price = (price / 10000) |> Float.round(2)
  "#{price}g"
end

Répondre à votre question

Pour répondre à ta question:

Elixir a-t-il des moyens de concaténer du texte à l'aide de l'opérateur de tuyau, ou n'est-ce pas possible sans définir la méthode vous-même?

Comme mentionné dans l'autre réponse par @Dogbert, vous pouvez utiliser Kernel.<>/2

Une autre solution consiste à l'envelopper dans une fonction anonyme.

def format_price(price) do
  (price / 10000)
  |> Float.round(2)
  |> to_string()
  |> (&<>/2).("g")
end

ou

def format_price(price) do
  (price / 10000)
  |> Float.round(2)
  |> to_string()
  |> (&(&1 <> "g")).()
end
5
ryanwinchester