2017-01-23 7 views
0

私はエリクシールから始まりますが、パターンマッチングを使用しているときにいくつか問題があります。パターンマッチングと設定値

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

は、以下の結果を達成するために:

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

戻り{FLOATVAL、_}をFloat.parse考慮

は考えIは、次のようなマップを宣言します。一時変数を宣言せずにこれを行うにはどうすればよいですか?

これを達成するためのコードは以下のコードですか?

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

答えて

2

Float.parseそれは、ユーザーがのtry/catch表現せずに有効な浮動小数点値ではない文字列を処理することができますので、ちょうどfloat値を返しません。

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

文字列がfloatでない場合、これは有益なエラーが発生しますString.to_float/1を使用することです行うには良い方法:あなたは、文字列のみ山車が含まれていることを知っている場合は、float値を取得するために|> elem(0)を行うことができます:あなたは優雅にエラーを処理したい場合は

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