Подтвердить что ты не робот

Могу ли я конкатенировать строки в Elixir и использовать оператора трубы?

В 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 или это невозможно без определения метода самостоятельно?

4b9b3361

Ответ 1

Да, вы можете, передав полный путь к функции, которая в этом случае Kernel.<>:

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

Ответ 2

Мои два цента

Я понимаю, что могу сделать то же самое, просто связав методы вместе, как 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