映射键存在且值大于 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 是不安全的,因为 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 可以视为 falsey42 可以视为 truthy 值。