模式匹配和设置值

时间:2017-01-23 18:12:49

标签: elixir

我从elixir开始,但在使用模式匹配时遇到了一些问题。

假设我要声明一个地图,例如:

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),
}

1 个答案:

答案 0 :(得分:2)

Float.parse不返回浮点值,因为它允许用户在没有try / catch表达式的情况下处理不是有效浮点值的字符串。如果你知道字符串只包含浮点数,你可以|> 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