映射键存在且值大于 0
Map key exists and value is larger than 0
我必须检查地图是否有键以及该键的值是否大于 0。目前我使用此代码:
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do
我想知道是否有 easier/better 方法可以做到这一点?
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do
是不安全的,因为 erlang terms can be compared against each other.
iex||1 ▸ [] > 0
#⇒ true
也就是说,最安全的方法是使用 Kernel.match?/2
与守卫进行模式匹配
match?(%{stock: stock} when stock > 0, portfolio)
为了防止错误输入,让守卫更严格。
match?(%{stock: stock} when is_number(stock) and stock > 0, portfolio)
iex||2 ▸ [%{stock: 3}, %{stock: 0}, %{}, %{stock: []}]
...||2 ▸ |> Enum.filter(&match?(%{stock: stock} when is_number(stock) and stock > 0, &1))
#⇒[%{stock: 3}]
旁注: 两个 布尔值 的逻辑合取惯用 and
而不是 &&
。后者用于非严格连接,其中 nil
可以视为 falsey
,42
可以视为 truthy
值。
我必须检查地图是否有键以及该键的值是否大于 0。目前我使用此代码:
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do
我想知道是否有 easier/better 方法可以做到这一点?
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do
是不安全的,因为 erlang terms can be compared against each other.
iex||1 ▸ [] > 0
#⇒ true
也就是说,最安全的方法是使用 Kernel.match?/2
match?(%{stock: stock} when stock > 0, portfolio)
为了防止错误输入,让守卫更严格。
match?(%{stock: stock} when is_number(stock) and stock > 0, portfolio)
iex||2 ▸ [%{stock: 3}, %{stock: 0}, %{}, %{stock: []}]
...||2 ▸ |> Enum.filter(&match?(%{stock: stock} when is_number(stock) and stock > 0, &1))
#⇒[%{stock: 3}]
旁注: 两个 布尔值 的逻辑合取惯用 and
而不是 &&
。后者用于非严格连接,其中 nil
可以视为 falsey
,42
可以视为 truthy
值。