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?
Oui, vous pouvez, en passant le chemin complet de la fonction, qui dans ce cas est Kernel.<>
:
iex(1)> "foo" |> Kernel.<>("bar")
"foobar"
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
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