Ответ 1
Да, вы можете, передав полный путь к функции, которая в этом случае Kernel.<>
:
iex(1)> "foo" |> Kernel.<>("bar")
"foobar"
В Elixir вы можете объединять строки с помощью оператора <>
, как в "Hello" <> " " <> "World"
.
Вы также можете использовать оператор |>
для объединения функций.
Я пытаюсь написать код Elixir для форматирования валюты для онлайн-игры.
def format_price(price) do
price/10000
|> Float.round(2)
|> to_string
|> <> "g"
end
Вышеуказанное приводит к синтаксической ошибке. Я пропускаю основную функцию, которая может объединять строки? Я знаю, что могу определить один сам, но это похоже на создание ненужного беспорядка в моем коде, если я могу избежать этого.
Я понимаю, что могу сделать то же самое, просто to_string(Float.round(price/10000, 2)) <> "g"
вместе методы, такие как to_string(Float.round(price/10000, 2)) <> "g"
, но этот синтаксис не так хорош для чтения, и он делает его Сложнее расширить метод в будущем, если я захочу добавить промежуточные этапы.
Есть ли в Elixir способы объединения текста с использованием оператора pipe или это невозможно без определения метода самостоятельно?
Да, вы можете, передав полный путь к функции, которая в этом случае Kernel.<>
:
iex(1)> "foo" |> Kernel.<>("bar")
"foobar"
Я понимаю, что могу сделать то же самое, просто связав методы вместе, как to_string (Float.round(price/10000, 2)) < > "g", но этот синтаксис не так хорош для чтения, и это затрудняет расширение метода в будущем, если я хочу добавить шаги между ними.
Вы можете использовать интерполяцию вместо конкатенации. Например, вы можете сделать это так, и это все еще нормально читать и просто, так легко изменить:
def format_price(price) do
price = (price / 10000) |> Float.round(2)
"#{price}g"
end
Чтобы ответить на ваш вопрос:
Есть ли у Elixir способы конкатенации текста с использованием оператора трубы, или это невозможно без определения метода самостоятельно?
Как упоминалось в другом ответе @Dogbert, вы можете использовать Kernel.<>/2
Другое решение - обернуть его анонимной функцией.
def format_price(price) do
(price / 10000)
|> Float.round(2)
|> to_string()
|> (&<>/2).("g")
end
или
def format_price(price) do
(price / 10000)
|> Float.round(2)
|> to_string()
|> (&(&1 <> "g")).()
end