我从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),
}
答案 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