separar - ¿Puedo concatenar cadenas en Elixir y usar el operador de tubería?
python separar string por caracter (2)
En Elixir, puede concatenar cadenas con el operador <>
, como en "Hello" <> " " <> "World"
.
También puede utilizar el operador de tubería |>
para encadenar funciones.
Estoy tratando de escribir el código Elixir para formatear la moneda de un juego en línea.
def format_price(price) do
price/10000
|> Float.round(2)
|> to_string
|> <> "g"
end
Lo anterior resulta en un error de sintaxis. ¿Estoy pasando por alto una función básica que puede concatenar cadenas? Sé que puedo definir uno por mí mismo, pero eso parece crear un desorden innecesario en mi código si puedo evitarlo.
Me doy cuenta de que puedo lograr lo mismo, simplemente encadenando los métodos como to_string(Float.round(price/10000, 2)) <> "g"
, pero esta sintaxis no es tan buena de leer, y la hace Más difícil es extender el método en el futuro, si quiero agregar pasos intermedios.
¿Tiene Elixir formas de concatenar texto usando el operador de tubería, o no es posible sin definir el método usted mismo?
Mis dos centavos
Me doy cuenta de que puedo lograr lo mismo, simplemente encadenando los métodos como to_string (Float.round (precio / 10000, 2)) <> "g", pero esta sintaxis no es tan buena de leer, y la hace Más difícil es extender el método en el futuro, si quiero agregar pasos intermedios.
Podrías usar interpolación en lugar de concatenación . Por ejemplo, podría hacerlo de esta manera y todavía está bien para leer, y simple, muy fácil de modificar:
def format_price(price) do
price = (price / 10000) |> Float.round(2)
"#{price}g"
end
Respondiendo tu pregunta
Para responder tu pregunta:
¿Tiene Elixir formas de concatenar texto usando el operador de tubería, o no es posible sin definir el método usted mismo?
Como se mencionó en la otra respuesta de @Dogbert, puede usar Kernel.<>/2
Otra solución es envolverlo en una función anónima.
def format_price(price) do
(price / 10000)
|> Float.round(2)
|> to_string()
|> (&<>/2).("g")
end
o
def format_price(price) do
(price / 10000)
|> Float.round(2)
|> to_string()
|> (&(&1 <> "g")).()
end
Sí, puede pasar la ruta completa a la función, que en este caso es Kernel.<>
:
iex(1)> "foo" |> Kernel.<>("bar")
"foobar"