【发布时间】:2021-10-18 14:58:29
【问题描述】:
我必须检查一个地图是否有一个键,以及该键的值是否大于 0。目前我使用这个代码:
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do
我想知道是否有更简单/更好的方法来做到这一点?
【问题讨论】:
标签: elixir
我必须检查一个地图是否有一个键,以及该键的值是否大于 0。目前我使用这个代码:
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do
我想知道是否有更简单/更好的方法来做到这一点?
【问题讨论】:
标签: elixir
if Map.has_key?(portfolio, stock) && Map.get(portfolio, stock) > 0 do 不安全,因为erlang 术语可以是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 值。
【讨论】: