2017-01-23 2 views
0

Я начинаю с эликсира, но у меня возникают проблемы при использовании соответствия шаблону.Соответствие шаблону и значения уставок

Предположим, я хочу объявить карту, такие как:

var = %{ 
    y: Float.parse("3.4"), 
    z: Float.parse("7.8") 
} 

Для достижения следующего результата:

var = %{ 
    y: 3.4, 
    z: 7.8 
} 

Принимая во внимание, что Float.parse возвращает {floatVal, _}. как я могу это сделать без объявления временных переменных?

Это код ниже, чтобы достичь этого?

var = %{ 
    y: Float.parse("3.4") |> elem(0), 
    z: Float.parse("7.8") |> elem(0), 
} 

ответ

2

Float.parse не возвращает только значение с плавающей точкой, так как позволяет пользователю обрабатывать строки, которые не являются допустимыми значениями с плавающей точкой без выражения попробовать/поймать. Если вы знаете, что строки будут содержать только поплавки, вы можете сделать |> elem(0), чтобы получить значение с плавающей точкой:

iex(1)> %{y: Float.parse("3.4") |> elem(0), z: Float.parse("7.8") |> elem(0)} 
%{y: 3.4, z: 7.8} 

А лучший способ сделать это состоит в использовании String.to_float/1, который поднимет информативное сообщение об ошибке, если строка не является поплавок :

iex(2)> %{y: String.to_float("3.4"), z: String.to_float("7.8")} 
%{y: 3.4, z: 7.8} 
iex(3)> %{y: String.to_float("3.4"), z: String.to_float("a7.8")} 
** (ArgumentError) argument error 
    :erlang.binary_to_float("a7.8") 

Если вы хотите, чтобы корректно обрабатывать ошибки, вы можете использовать with, а также:

iex(4)> with {y, ""} <- Float.parse("3.4"), {z, ""} <- Float.parse("7.8"), do: %{y: y, z: z} 
%{y: 3.4, z: 7.8} 
iex(5)> with {y, ""} <- Float.parse("3.4"), {z, ""} <- Float.parse("a7.8"), do: %{y: y, z: z} 
:error 
+0

Круто. Спасибо за это. – absg

Смежные вопросы